JProfiler 支持通过专用的任务在 Gradle 中进行 profiling。此外,JProfiler 还提供了许多 用于处理快照的命令行可执行文件,它们都有对应的 Gradle 任务。
使用 Gradle 任务
要在 Gradle 构建文件中使用 JProfiler Gradle 任务,可以使用 plugins
块
plugins {
id 'com.jprofiler' version 'X.Y.Z'
}
如果您不想为此使用 Gradle 插件仓库,Gradle 插件也可在文件 bin/gradle.jar 中找到。
默认情况下,该插件会自动预配与插件版本相同的 JProfiler 发行版,并将其保存在 <Gradle user home>/jprofiler/dist 下。要覆盖缓存目录,请在
jprofiler 块中设置 autoProvisioningCacheDir 属性。
如果您想改用本地 JProfiler 安装,请告知 JProfiler Gradle 插件 JProfiler 的安装位置。在 macOS 上,安装目录为应用程序包的路径,例如
/Applications/JProfiler.app。
jprofiler {
installDir = file('/path/to/jprofiler/home')
}
从 Gradle 进行 Profiling
通过类型为 com.jprofiler.gradle.JavaProfile 的任务,您可以 profile 任何 Java 进程。该类继承自 Gradle 内置的
JavaExec,因此您可以使用相同的参数来配置进程。要对测试进行 profiling,请使用继承自 Gradle Test 任务的
com.jprofiler.gradle.TestProfile 类型的任务。
在没有任何进一步配置的情况下,这两个任务都会启动一个交互式 profiling 会话 (session),其中 profiling agent 会在默认端口 8849 上等待来自 JProfiler GUI 的连接。对于离线 profiling,您可以引用导出的配置文件,也可以直接使用下表中所示的属性来配置通用会话设置 (session settings) 和自动记录。
| 属性 | 描述 | 是否必需 |
|---|---|---|
| offline | profiling 运行是否应处于离线模式。 |
否,offline 和 nowait 不能同时为 true。
|
| nowait | profiling 是否应立即开始,或者被分析 (profiled) 的 JVM 是否应等待来自 JProfiler GUI 的连接。 | |
| sessionId |
定义应从中获取配置文件设置 (profiling setting) 的会话 (session) ID。如果既未设置 nowait 也未设置
offline,则此项无效,因为在这种情况下 profiling 会话 (session) 是在 GUI 中选择的。
|
仅在离线 profiling 设置了 configFile 时必需
|
| configFile | 定义应从中读取配置文件设置 (profiling setting) 的配置文件。如果离线 profiling 省略了该属性,则可以使用以下属性直接配置通用会话设置 (session settings)。如果未设置这些属性中的任何一个,则使用默认的离线会话设置 (session settings)。 | 否 |
| callTreeMode |
为无配置的离线 profiling 选择调用树 (call tree) 收集模式。在 Gradle 中,可以使用 com.jprofiler.buildtools.CallTreeMode
的值。字符串值为 sampling、instrumentation、instr 和
async。
|
否 |
| profile, compact, ignore |
无配置离线 profiling 的包或类过滤器。值可以是带有以 : 分隔条目的字符串,也可以是字符串列表。
|
否 |
| lineNumbers | 是否应在调用树 (call tree) 中记录行号。 | 否 |
| snapshotFile |
自动离线记录的快照文件。如果在未设置 recording 的情况下设置了此项,则会记录 CPU 数据。线程和遥测 (telemetry) 数据始终会被记录。
|
否 |
| recording |
用于自动离线记录的数据类型。值可以是条目以 : 分隔的字符串,也可以是字符串列表。常见值包括
cpu、allocation、jdbc、jpa、mongo_db、http_server
和 http_client。受支持的记录值的完整列表在相应的 -agentpath
选项中有说明。选择探针 (probe) 记录也会同时记录 CPU 数据。
|
否,但如果设置了该项,则需要设置 snapshotFile |
| duration |
自动离线记录的持续时间,例如 30s、10m 或 1h。如果没有此属性,记录将一直持续到 JVM
终止,届时将保存快照。
|
否,但如果设置了该项,则需要设置 snapshotFile |
| delay |
自动离线记录开始前的延迟,例如 10s 或 1m。
|
否,但如果设置了该项,则需要设置 snapshotFile |
| port |
定义 profiling agent 应监听来自 JProfiler GUI 连接的端口号。这必须与远程会话 (session) 配置中配置的端口相同。如果未设置或为零,将使用默认端口 (8849)。如果设置了
offline,则此项无效,因为在这种情况下不存在来自 GUI 的连接。
|
否 |
| debugOptions | 如果您想出于调优或调试目的传递任何其他库 (library) 参数,可以使用此属性。 | 否 |
下面给出了一个用于 profile 由所在项目编译且带有 main 方法的 Java 类的示例:
task run(type: com.jprofiler.gradle.JavaProfile) {
mainClass = 'com.mycorp.MyMainClass'
classpath sourceSets.main.runtimeClasspath
offline = true
callTreeMode = 'sampling'
profile = ['com.mycorp.', 'org.example.']
snapshotFile = file('build/snapshots/run.jps')
recording = ['cpu', 'allocation', 'jdbc']
duration = '10m'
}
对于无配置属性未涵盖的高级设置,请导出配置文件并使用 configFile 和 sessionId 进行引用。
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 示例项目。
如果您需要 profiling 所需的 VM 参数,com.jprofiler.gradle.SetAgentpathProperty 任务会将其分配给通过
propertyName 属性配置名称的属性。应用 JProfiler 插件会自动向您的项目添加一个名为 setAgentPathProperty
的此类任务。要获取前一个示例中使用的 VM 参数,您只需添加
setAgentPathProperty {
propertyName = 'profilingVmParameter'
offline = true
callTreeMode = 'sampling'
profile = ['com.mycorp.', 'org.example.']
}
到您的项目中,并为其他任务添加对 setAgentPathProperty 的依赖。然后,您可以在该任务的执行阶段使用项目属性
profilingVmParameter。将该属性赋值给其他任务属性时,请将其使用包裹在 doFirst {...} 代码块中,以确保您处于 Gradle
执行阶段而不是配置阶段。
从快照导出数据
com.jprofiler.gradle.Export 任务可用于从已保存的快照中导出视图 (view),并复刻了 bin/jpexport
命令行工具 的参数。它支持以下属性:
| 属性 | 描述 | 是否必需 |
|---|---|---|
| snapshotFile |
快照文件的路径。这必须是扩展名为 .jps
的文件。
|
是 |
| ignoreErrors |
忽略设置视图 (view) 选项时发生的错误并继续处理下一个视图 (view)。默认值为 false,意味着在发生第一个错误时导出将终止。
|
否 |
| csvSeparator | CSV 导出的字段分隔符。默认为 ","。 | 否 |
| obfuscator |
为选定的混淆器反混淆类名和方法名。默认为 "none",对于其他值,必须指定 mappingFile 选项。取值为
none、proguard 或 yguard 之一。
|
否 |
| mappingFile |
选定混淆器的映射文件。仅在指定了 obfuscator 属性时才可设置。
|
仅在指定了 obfuscator 时必需
|
在导出任务中,调用 views 方法并向其传递一个闭包,在闭包中可以一次或多次调用 view(name, file[, options])。每次调用
view 都会生成一个输出文件。name 参数为视图 (view) 名称。有关可用视图 (view) 名称的列表,请参见
jpexport
命令行可执行文件 的帮助页面。参数 file
为输出文件,可以是绝对路径文件,也可以是相对于项目的相对路径文件。最后,可选的 options 参数是一个包含所选视图 (view) 导出选项的 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 |
应进行比较的快照文件。您可以传递任何包含 Gradle 可解析为文件集合的对象的 Iterable。
如果快照文件具有单独的反混淆设置,则文件名可以采用 <file name>:<obfuscator>:<mapping file> 的形式,其中 <obfuscator> 和 <mapping file> 对应于下方的全局选项。 |
是 |
| obfuscator |
为选定的混淆器反混淆类名和方法名。默认为 "none",对于其他值,必须指定 mappingFile 选项。取值为
none、proguard 或 yguard 之一。
|
否 |
| mappingFile |
选定混淆器的映射文件。仅在指定了 obfuscator 属性时才可设置。
|
仅在指定了 obfuscator 时必需
|
| sortByTime |
如果设置为 true,所有提供的快照文件将按其文件修改时间排序,否则将按在 snapshotFiles 属性中指定的顺序进行比较。
|
否 |
| ignoreErrors |
忽略设置比较选项时发生的错误并继续进行下一次比较。默认值为 false,意味着在发生第一个错误时比较将终止。
|
否 |
正如为 Export 任务定义导出的视图 (view) 一样,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'])
}
}
或者,如果您想要为多个快照创建遥测 (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'])
}
}
分析堆快照
Gradle 任务 com.jprofiler.gradle.Analyze 具有与 bin/jpanalyze
命令行工具 相同的功能。
该任务具有类似于 Compare 任务的 snapshotFiles 属性以指定要处理的快照,以及类似于 Export 任务的
obfuscator 和 mappingFile 属性用于反混淆。属性
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')
}