Gradle任务
JProfiler支持从Gradle中用特定任务进行分析。此外,JProfiler提供了一些具有相应Gradle任务的 用于处理快照的命令行可执行文件。
使用Gradle任务
要使JProfiler Gradle任务在Gradle构建文件中可用,你可以使用plugins
块。
plugins { id 'com.jprofiler' version 'X.Y.Z' }
如果你不想为此使用Gradle插件库,Gradle插件发布在文件bin/gradle.jar
中 。
接下来,你必须告诉JProfiler Gradle插件JProfiler安装在哪里。
jprofiler { installDir = file('/path/to/jprofiler/home') }
从Gradle进行分析
使用com.jprofiler.gradle.JavaProfile
类型的任务,你可以对任何Java进程进行分析。
这个类继承了Gradle内置的JavaExec
,所以你可以使用相同的参数来配置进程。
对于分析测试,使用类型为com.jprofiler.gradle.TestProfile
的任务,它继承了 Gradle 的Test
任务。
无需任何进一步的配置,这两个任务都会启动一个交互式的分析会话,分析代理在默认的8849端口上等待来自JProfiler GUI的连接。 对于离线分析,你必须添加一些属性,如下表所示:
属性 | 说明 | 必需 |
---|---|---|
offline | 分析运行是否应该处于离线模式。 |
不,offline 和nowait 不可以同时设置为true 。
|
nowait | 分析是否应该立即开始,或者分析的JVM是否应该等待JProfiler GUI的连接。 | |
SessionId |
定义会话ID,分析设置应从该会话中获取。如果既没有设置nowait ,也没有设置offline,则没有影响,
因为在这种情况下,分析会话是在GUI中选择的。
|
必需,如果
|
configFile | 定义从中读取分析设置的配置文件。 | 不 |
port |
定义分析代理应监听来自JProfiler GUI连接的端口号。 这必须与远程会话配置中配置的端口相同。
如果没有设置或为零,将使用默认端口(8849)。如果设置了offline ,则没有影响,
因为在这种情况下,没有来自GUI的连接。
| 不 |
debugOptions | 如果你想传递任何额外的库参数用于调优或调试,你可以通过这个属性来实现。 | 不 |
下面给出了一个例子,用来分析一个带有主方法的Java类,该方法是由包含的项目编译的:
task run(type: com.jprofiler.gradle.JavaProfile) { mainClass = 'com.mycorp.MyMainClass' classpath sourceSets.main.runtimeClasspath offline = true sessionId = 80 configFile = file('path/to/jprofiler_config.xml') }
你可以在api/samples/offline
示例项目中看到这个任务的可运行示例。
与标准的JavaExec
任务不同,JavaProfile
任务也可以通过调用
createProcess()
在后台启动。请参阅api/samples/mbean
示例项目以了解此功能的演示。
如果你需要分析所需的VM参数,com.jprofiler.gradle.SetAgentpathProperty
任务将把它分配给名称用propertyName
属性配置的属性。
应用JProfiler插件会自动将一个名为setAgentPathProperty
的这种类型的任务添加到你的项目中。
为了获得将在前面的例子中使用的VM参数,你可以简单地添加
setAgentPathProperty { propertyName = 'profilingVmParameter' offline = true sessionId = 80 configFile = file('path/to/jprofiler_config.xml') }
到你的项目中,并将setAgentPathProperty
的依赖关系添加到其他任务中。
然后你就可以在该任务的执行阶段使用项目属性profilingVmParameter
。
当将该属性分配给其他任务属性时,用doFirst {...}
代码块包围它的使用,
以确保你是在Gradle执行阶段而不是在配置阶段。
从快照中导出数据
com.jprofiler.gradle.Export
任务可用于从已保存的快照导出视图,
并复制
bin/jpexport命令行工具的参数。
它支持以下属性:
属性 | 说明 | 必需 |
---|---|---|
snapshotFile |
快照文件的路径。这必须是一个扩展名为.jps 的文件。
| 是 |
ignoreErrors |
忽略无法设置视图选项时发生的错误,继续下一个视图。默认值是false ,
这意味着当第一个错误发生时,导出将被终止。
| 不 |
csvSeparator | CSV导出的字段分隔符。默认值为","。 | 不 |
obfuscator |
对所选混淆器的类和方法名称进行去混淆。默认值为"none",对于其他值,必须指定mappingFile 选项。
none ,proguard 或yguard 中的一个。
| 不 |
mappingFile |
所选混淆器的映射文件。只有在指定了obfuscator 属性的情况下才可以设置。
|
只有当指定obfuscator
|
在导出任务中,你调用views
方法,并向它传递一个闭包,通过一次或多次调用
view(name, file[, options])
。每次调用view
,都会产生一个输出文件。
name
参数是视图名称。有关可用视图名称的列表,
请参见
jpexport命令行可执行文件的帮助页面。
参数
file
是输出文件,可以是绝对文件,也可以是相对于项目的文件。
最后,可选的options
参数是一个Map,其中包含所选视图的导出选项。
使用导出任务的一个例子是:
task export(type: com.jprofiler.gradle.Export) { snapshotFile = file('snapshot.jps') views { view('CallTree', 'callTree.html') view('HotSpots', 'hotSpots.html', [threadStatus: 'all', expandBacktraces: 'true']) } }
比较快照
和 bin/jpcompare命令行工具一样,
com.jprofiler.gradle.Compare
任务可以比较两个或多个快照。它的属性是:
属性 | 说明 | 必需 |
---|---|---|
snapshotFiles |
需要比较的快照文件。你可以传递任何包含对象的Iterable ,gradle将其解析为文件集合。
| 是 |
sortByTime |
如果设置为true ,所有提供的快照文件都会按照文件的修改时间进行排序,
否则会按照snapshotFiles 属性中指定的顺序进行比较。
| 不 |
ignoreErrors |
忽略无法设置比较选项时发生的错误,并继续进行下一个比较。默认值是false ,
这意味着当第一个错误发生时,导出将被终止。
| 不 |
就像为Export
任务定义导出的视图一样,Compare
任务也有一个comparisons
方法,
在该方法中,对comparison(name, file[, options])
的嵌套调用定义了应执行的比较。
可用的比较名称列表可在
jpcompare命令行可执行文件的帮助页面上找到。
使用比较任务的一个例子是:
task compare(type: com.jprofiler.gradle.Compare) { snapshotFiles = files('snapshot1.jps', 'snapshot2.jps') comparisons { comparison('CallTree', 'callTree.html') comparison('HotSpots', 'hotSpots.csv', [valueSummation: 'total', format: 'csv']) } }
或者,如果你想为多个快照创建一个遥测比较:
task compare(type: com.jprofiler.gradle.Compare) { snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps') sortByTime = true comparisons { comparison('TelemetryHeap', 'heap.html', [valueType: 'maximum']) comparison('ProbeTelemetry', 'jdbc.html', [probeId: 'JdbcProbe']) } }
分析堆快照
gradle任务com.jprofiler.gradle.Analyze
的功能和
bin/jpanalyze命令行工具一样。
该任务有一个snapshotFiles
属性,就像Compare
任务指定处理的快照,
obfuscator
和mappingfile
属性,就像Export
任务,
用于去混淆。removeUnreferenced
,retainSoft
,retainWeak
,
retainPhantom
,retainFinalizer
和retained
这些属性对应于命令行工具的参数。
下面给出了一个使用Analyze
任务的例子:
task analyze(type: com.jprofiler.gradle.Analyze) { snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps') retainWeak = true obfuscator = 'proguard' mappingFile = file('obfuscation.txt') }