JProfiler帮助文档

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 分析运行是否应该处于离线模式。 不,offlinenowait 不可以同时设置为true
nowait 分析是否应该立即开始,或者分析的JVM是否应该等待JProfiler GUI的连接。
SessionId 定义会话ID,分析设置应从该会话中获取。如果既没有设置nowait ,也没有设置offline,则没有影响, 因为在这种情况下,分析会话是在GUI中选择的。 必需,如果
  • offline 被设置
  • nowait 被设置,为版本为1.5的JVM。
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,proguardyguard 中的一个。
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 任务指定处理的快照, obfuscatormappingfile属性,就像Export 任务, 用于去混淆。removeUnreferenced,retainSoft,retainWeak, retainPhantom,retainFinalizerretained 这些属性对应于命令行工具的参数。

下面给出了一个使用Analyze 任务的例子:

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