使用 JProfiler 分析应用程序有两种根本不同的方式:默认情况下,您在 Attach JProfiler GUI 的状态下进行分析。JProfiler GUI 为您提供了用于启动和停止记录的按钮,并向您显示所有记录的分析数据。
在某些情况下,您希望在没有 JProfiler GUI 的情况下进行分析,并在稍后分析结果。对于这种情况,JProfiler 提供了离线分析。离线分析允许您在带有 profiling agent 的情况下启动被分析 (profiled) 应用程序,而无需连接 JProfiler GUI。
然而,离线分析仍然需要执行一些操作。至少必须保存一个快照 (snapshot),否则稍后将没有可供分析的分析数据。此外,要查看 CPU 或分配 (allocation) 数据,您必须在某个时刻开始记录。同样,如果您希望能够在保存的快照中使用 Heap Walker,则必须触发堆转储 (heap dump)。
Profiling API
解决此问题的第一个方案是 Controller API。借助该 API,您可以在代码中以编程方式调用所有分析操作。在 api/samples/offline
目录中,有一个可运行的示例,向您展示如何在实践中使用 Controller API。在该目录中执行 ../gradlew 以编译并运行它,并研究 Gradle 构建文件
build.gradle 以了解测试程序是如何被调用的。
Controller API
是在运行时管理分析操作的主要接口。它包含在 JProfiler 安装目录的 bin/agent.jar 中,或者可以通过以下坐标作为 Maven 依赖项引入:
group: com.jprofiler artifact: jprofiler-controller version: <JProfiler version>
来自于 Maven Central 仓库。
如果在应用程序的正常执行期间使用 Profiling API,这些 API 调用将静默地不执行任何操作。
这种方法的缺点是,您必须在开发期间将 JProfiler agent 库 (library) 添加到应用程序的类路径 (classpath) 中,向源代码中添加分析指令,并且每次更改编程分析操作时都需要重新编译代码。
触发器 (trigger)
借助触发器 (trigger),您可以在 JProfiler GUI 中指定所有分析操作,而无需修改源代码。触发器保存在 JProfiler 配置文件中。当您在启用离线分析的情况下启动时,配置文件和会话 (session) ID 会在命令行上传递给 profiling agent,以便 profiling agent 可以读取这些触发器定义。
与在源代码中添加 API 调用的 Profiling API 不同,触发器在 JVM 中发生特定事件时激活。例如,您可以使用方法调用触发器,而无需在方法的开头或结尾添加针对特定分析操作的 API 调用。作为另一个用例,您可以使用定时器触发器,而无需创建自己的定时器线程来定期保存快照。
每个触发器都有一个操作列表,这些操作在相关事件发生时执行。其中一些操作对应于 Controller API 中的分析操作。此外,还有一些超出 Controller 功能的其他操作,例如打印带有参数和返回值的方法调用 (method call) 的操作,或者为方法调用拦截器脚本的操作。
配置离线分析
如果您在 JProfiler 中配置了已启动的会话 (session),可以通过从主菜单调用 Session→Conversion Wizards→Convert Application Session to Offline 将其转换为离线会话。这将创建一个带有相应 VM 参数的启动脚本,并从您在 JProfiler UI 中使用的同一会话中获取配置文件设置 (profiling setting)。如果您想将调用移动到另一台计算机,则必须使用 Session→Export Session Settings 将会话导出到配置文件,并确保启动脚本中的 VM 参数引用该文件。
使用集成向导分析应用服务器时,总是会修改一个启动脚本或配置文件,以便将用于分析的 VM 参数插入到 Java 调用中。所有集成向导在“Startup”步骤中都有一个“Profile offline”选项,以便将应用服务器配置为离线分析而不是交互式分析。
您可能希望自己将 VM 参数传递给 Java 调用,例如当您的启动脚本没有由集成向导处理时。该 VM 参数的格式为
-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]
并且可以从 [Generic application] 向导中获取。
将 offline 作为库 (library) 参数传递会启用离线分析。在这种情况下,无法与 JProfiler GUI 建立连接。id
参数决定应将配置文件中的哪个会话 (session) 用于配置文件设置 (profiling setting)。会话的 ID 可以在会话设置对话框的 Application settings
选项卡右上角看到。可选的 config 参数指向配置文件。您可以通过调用 Session→Export Session
Settings 来导出此文件。如果省略该参数,将使用标准配置文件。该文件位于用户主目录中的 .jprofiler16 目录中。
对于常见的离线会话,您可以省略 id 和 config,并直接在 -agentpath 参数中指定会话设置,例如:
-agentpath:<path to jprofilerti library>=offline,callTreeMode=sampling,profile=com.mycorp.:org.example.
有关可用内联设置的列表,请参阅关于在启动时配置配置文件设置 (profiling setting) 的帮助主题。仅当您需要高级设置(例如触发器 (trigger) 或特定于探针 (probe) 的配置)时,才使用导出的配置文件。
您还可以添加自动记录选项以在无需 API 调用或 jpcontroller 的情况下保存快照:
-agentpath:<path to jprofilerti library>=offline,snapshot=/path/to/snapshot.jps,recording=cpu:allocation,duration=10m
使用 Gradle 和 Ant 进行离线分析
当您从 Gradle 或 Ant 启动离线分析时,可以使用相应的 JProfiler 插件来简化工作。用于分析测试的 Gradle Task 典型用法如下所示:
plugins {
id 'com.jprofiler' version 'X.Y.Z'
id 'java'
}
jprofiler {
installDir = file('/opt/jprofiler')
}
task run(type: com.jprofiler.gradle.TestProfile) {
offline = true
configFile = file("path/to/jprofiler_config.xml")
sessionId = 1234
}
com.jprofiler.gradle.JavaProfile Task 可以像使用标准 JavaExec Task 执行一样分析任何 Java 类。如果您使用
JProfiler 未直接支持的其他方法启动 JVM,则 com.jprofiler.gradle.SetAgentpathProperty Task 可以将所需的 VM 参数写入属性中。应用
JProfiler 插件时默认会添加该 Task,因此您可以简单地编写:
setAgentPathProperty {
propertyName = 'agentPathProperty'
offline = true
configFile = file("path/to/jprofiler_config.xml")
sessionId = 1234
}
然后在 Task 执行后,在其他位置将 agentPathProperty 用作项目属性引用。所有 Gradle Task 和相应 Ant Task 的功能都在单独的章节中有详细记录。
为运行中的 JVM 启用离线分析
使用命令行实用程序 bin/jpenable,您可以在任何版本为 8 或更高版本的运行中 JVM 中启动离线分析。就像 VM 参数一样,您必须指定一个
offline 开关、一个会话 ID 和一个可选配置文件:
jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml
对于常见的离线会话,可以使用内联会话设置替换 --id 和 --config:
jpenable --offline --call-tree-mode=sampling --profile=com.mycorp.:org.example.
单次记录也可以用相同的方式配置:
jpenable --offline --snapshot=/path/to/snapshot.jps --recording=cpu:allocation --duration=10m
通过这样的调用,您必须从正在运行的 JVM 列表中选择一个进程。借助附加参数 --pid=<PID> --noinput,您可以使该过程自动化,从而完全不需要用户输入。
如果您未配置自动记录,则可能需要手动启动记录或保存快照。这可以通过 bin/jpcontroller 命令行工具来实现。
如果仅加载了 profiling agent,但未应用任何配置文件设置 (profiling setting),则无法开启任何记录操作,因此 jpcontroller
将无法连接。这包括使用 jpenable 启用分析但不带 offline 参数的情况。如果启用离线模式,则指定了配置文件设置,并且可以使用
jpcontroller。
有关 jpenable 和 jpcontroller 可执行文件的更多信息,请参阅命令行参考。







