JProfiler 支持通过 Gradle 的特殊任务进行分析 (profiling)。此外,JProfiler 还提供了一些 用于处理快照 (snapshot) 的命令行可执行文件 (command line executables) ,这些可执行文件也有对应的 Gradle 任务。
使用 Gradle 任务
要在 Gradle 构建文件中使用 JProfiler 的 Gradle 任务,可以在 plugins
块中添加如下内容
plugins {
id 'com.jprofiler' version 'X.Y.Z'
}
如果你不想通过 Gradle 插件仓库获取插件,JProfiler 插件也包含在 bin/gradle.jar 文件中。
接下来,你需要告诉 JProfiler Gradle 插件 JProfiler 的安装路径。
jprofiler {
installDir = file('/path/to/jprofiler/home')
}
通过 Gradle 进行分析 (Profiling)
通过 com.jprofiler.gradle.JavaProfile 类型的任务,你可以分析任何 Java 进程。
该类继承自 Gradle 内置的 JavaExec,因此你可以使用相同的参数来配置进程。对于测试分析,请使用
com.jprofiler.gradle.TestProfile
类型的任务,该任务继承自 Gradle 的 Test 任务。
如果不做额外配置,这两个任务都会启动一个交互式分析会话 (profiling session),分析代理 (agent) 会在默认端口 8849 等待 JProfiler GUI 的连接。对于离线分析 (offline profiling),你需要添加下表中展示的一些属性。
| 属性 | 描述 | 是否必需 |
|---|---|---|
| offline | 是否以离线模式 (offline mode) 运行分析。 |
否,offline 和 nowait 不能同时为 true。
|
| nowait | 是否立即开始分析,或者被分析 (profiled) 的 JVM 是否需要等待 JProfiler GUI 的连接。 | |
| sessionId |
指定用于获取分析配置 (profiling settings) 的会话 ID (session ID)。如果既没有设置
nowait 也没有设置 offline,则该属性无效,因为此时会在 GUI 中选择分析会话。
|
当满足以下条件时必需:
|
| configFile | 指定用于读取分析配置 (profiling settings) 的配置文件。 | 否 |
| port |
指定分析代理 (agent) 监听 JProfiler GUI 连接的端口号。该端口必须与远程会话配置 (remote session configuration) 中配置的端口一致。
如果未设置或为零,则使用默认端口(8849)。如果设置了 offline,则该属性无效,因为此时不会有 GUI 连接。
|
否 |
| debugOptions | 如果你需要传递额外的库 (library) 参数用于调优或调试,可以通过该属性实现。 | 否 |
下面是一个分析包含 main 方法的 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 任务可用于从已保存的快照 (snapshot) 导出视图 (view),
并复用 bin/jpexport
命令行工具 (command line tool) 的参数。
它支持以下属性:
| 属性 | 描述 | 是否必需 |
|---|---|---|
| snapshotFile |
快照文件的路径。该文件必须以 .jps
为扩展名。
|
是 |
| ignoreErrors |
忽略在无法为某个视图设置选项时发生的错误,并继续处理下一个视图。默认值为 false,即遇到第一个错误时导出终止。
|
否 |
| csvSeparator | CSV 导出时的字段分隔符字符。默认为 ","。 | 否 |
| obfuscator |
为所选混淆器 (obfuscator) 反混淆类和方法名。默认为 "none",如需其他值,必须指定 mappingFile 选项。可选值为
none、
proguard 或 yguard。
|
否 |
| mappingFile |
所选混淆器 (obfuscator) 的映射文件。仅当指定了 obfuscator 属性时可设置。
|
仅当指定了 obfuscator 时
|
在 export 任务中,你可以调用 views 方法并传递一个闭包 (closure),在其中多次调用
view(name, file[, options])。每次调用 view 都会生成一个输出文件。name 参数为视图名称。可用视图名称列表请参见
jpexport
命令行可执行文件 (command line executable) 的帮助页面。
file 参数为输出文件,可以是绝对路径,也可以是相对于项目的路径。
最后,options 参数(可选)是一个包含所选视图导出选项的 map。
使用 export 任务的示例:
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
命令行工具 (command line tool) 类似,
com.jprofiler.gradle.Compare 任务可用于比较两个或多个快照 (snapshot)。
其属性如下:
| 属性 | 描述 | 是否必需 |
|---|---|---|
| snapshotFiles |
需要比较的快照文件。你可以传递任何包含 Gradle 可解析为文件集合 (file collections) 的 Iterable。
如果快照文件有各自的反混淆设置,文件名可以采用如下格式: <文件名>:<混淆器>:<映射文件> 其中 <obfuscator> 和 <mapping file> 对应下方的全局选项。 |
是 |
| obfuscator |
为所选混淆器 (obfuscator) 反混淆类和方法名。默认为 "none",如需其他值,必须指定 mappingFile 选项。可选值为
none、
proguard 或 yguard。
|
否 |
| mappingFile |
所选混淆器 (obfuscator) 的映射文件。仅当指定了 obfuscator 属性时可设置。
|
仅当指定了 obfuscator 时
|
| sortByTime |
如果设置为 true,所有提供的快照文件将按文件修改时间排序,否则将按照 snapshotFiles
属性中指定的顺序进行比较。
|
否 |
| ignoreErrors |
忽略在无法为某个比较设置选项时发生的错误,并继续处理下一个比较。
默认值为 false,即遇到第一个错误时导出终止。
|
否 |
与 Export 任务中定义导出视图类似,Compare 任务有一个 comparisons 方法,可以通过嵌套调用
comparison(name, file[, options])
来定义需要执行的比较。可用比较名称列表请参见 jpcompare
命令行可执行文件 (command line executable) 的帮助页面。
使用 compare 任务的示例:
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'])
}
}
或者,如果你想为多个快照创建遥测 (telemetry) 比较:
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'])
}
}
分析堆快照 (heap snapshots)
gradle 任务 com.jprofiler.gradle.Analyze 具有与
bin/jpanalyze
命令行工具 (command line tool) 相同的功能。
该任务有一个 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')
}