JProfiler帮助文档

Gradle 任务

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) 运行分析。 否,offlinenowait 不能同时为 true
nowait 是否立即开始分析,或者被分析 (profiled) 的 JVM 是否需要等待 JProfiler GUI 的连接。
sessionId 指定用于获取分析配置 (profiling settings) 的会话 ID (session ID)。如果既没有设置 nowait 也没有设置 offline,则该属性无效,因为此时会在 GUI 中选择分析会话。 当满足以下条件时必需:
  • 设置了 offline
  • 对于 1.5 JVM,设置了 nowait
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 选项。可选值为 noneproguardyguard
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 选项。可选值为 noneproguardyguard
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 任务一样)用于指定要处理的快照,以及 obfuscatormappingfile 属性(与 Export 任务一样)用于反混淆。此外,removeUnreferencedretainSoftretainWeakretainPhantomretainFinalizerretained 属性对应命令行工具的参数。

使用 Analyze 任务的示例如下:

task analyze(type: com.jprofiler.gradle.Analyze) { 
    snapshotFiles = fileTree(dir: 'snapshots', include: '*.jps') 
    retainWeak = true 
    obfuscator = 'proguard' 
    mappingFile = file('obfuscation.txt') 
}