使用 JProfiler 分析应用程序有两种根本不同的方式:默认情况下,您在附加了 JProfiler GUI 的情况下进行分析。JProfiler GUI 提供按钮来启动和停止记录,并显示所有已记录的分析数据。
在某些情况下,您可能希望在不使用 JProfiler GUI 的情况下进行分析,并在之后分析结果。针对这种场景,JProfiler 提供了离线分析功能。离线分析允许您在启动被分析应用程序时使用分析代理,而无需连接 JProfiler GUI。
但是,离线分析仍然需要执行一些操作。至少需要保存一个快照,否则之后将没有可供分析的分析数据。此外,要查看 CPU 或分配数据,您必须在某个时间点开始记录。同样,如果您希望在保存的快照中使用堆遍历器,则必须触发堆转储。
分析 API
解决此问题的第一个方案是控制器 API。通过该 API,您可以在代码中以编程方式调用所有分析操作。在 api/samples/offline 目录中,有一个可运行的示例,向您展示如何在实践中使用控制器
API。在该目录中执行 ../gradlew 以编译并运行它,并研究 Gradle 构建文件 build.gradle 以了解测试程序是如何被调用的。
Controller API
是在运行时管理分析操作的主要接口。它包含在您的 JProfiler 安装目录中的 bin/agent.jar 中,或作为 Maven 依赖项,坐标为
group: com.jprofiler artifact: jprofiler-probe-injected version: <JProfiler version>
来自 Maven Central 仓库。
如果在应用程序的正常执行过程中使用分析 API,API 调用将静默地不执行任何操作。
这种方式的缺点是,您必须在开发期间将 JProfiler 代理库添加到应用程序的类路径中,将分析指令添加到源代码中,并在每次更改编程分析操作时重新编译代码。
触发器
通过触发器,您可以在 JProfiler GUI 中指定所有分析操作,而无需修改源代码。触发器保存在 JProfiler 配置文件中。当您启用离线分析时,配置文件和会话 ID 通过命令行传递给分析代理,以便分析代理可以读取这些触发器定义。
与分析 API(您需要在源代码中添加 API 调用)不同,触发器在 JVM 中发生特定事件时被激活。例如,您可以使用方法调用触发器,而不是在方法的开头或结尾添加某个分析操作的 API 调用。另一个使用场景是,您可以使用定时器触发器,而不是创建自己的定时器线程来定期保存快照。
每个触发器都有一个操作列表,当关联事件发生时执行这些操作。其中一些操作对应于控制器 API 中的分析操作。此外,还有其他超出控制器功能的操作,例如打印带有参数和返回值的方法调用的操作,或为方法调用拦截器脚本的操作。
配置离线分析
如果您在 JProfiler 中配置了一个已启动的会话,可以通过从主菜单调用 Session→Conversion Wizards→Convert Application Session To Offline 将其转换为离线会话。这将创建一个带有适当 VM 参数的启动脚本,并从您在 JProfiler UI 中使用的同一会话中获取配置文件设置。如果您想将调用移至另一台计算机,则必须使用 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 作为库参数传递可启用离线分析。在这种情况下,无法与 JProfiler GUI 建立连接。id
参数决定使用配置文件中的哪个会话作为配置文件设置。会话的 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.
请参阅关于在启动时设置配置文件设置的帮助主题,以获取可用内联设置的列表。仅在需要触发器或探针特定配置等高级设置时,才使用导出的配置文件。
您还可以添加自动记录选项,以在不使用 API 调用或 jpcontroller 的情况下保存快照:
-agentpath:<path to jprofilerti library>=offline,snapshot=/path/to/snapshot.jps,recording=cpu:allocation,duration=10m
使用 Gradle 和 Ant 进行离线分析
当您从 Gradle 或 Ant 启动离线分析时,可以使用相应的 JProfiler 插件来简化工作。下面展示了用于分析测试的 Gradle 任务的典型用法:
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 任务以与使用标准 JavaExec 任务执行相同的方式分析任何 Java
类。如果您使用某种其他方式启动 JVM,而 JProfiler 不直接支持该方式,则 com.jprofiler.gradle.SetAgentPathProperty 任务可以将所需的 VM
参数写入属性。应用 JProfiler 插件时,该任务默认会被添加,因此您可以直接编写:
setAgentPathProperty {
propertyName = 'agentPathProperty'
offline = true
configFile = file("path/to/jprofiler_config.xml")
sessionId = 1234
}
然后在任务执行后,在其他地方将 agentPathProperty 用作项目属性引用。所有 Gradle 任务及相应 Ant 任务的功能在独立章节中有详细说明。
为运行中的 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 命令行工具来实现。
如果分析代理仅被加载,但未应用任何配置文件设置,则无法开启任何记录操作,因此 jpcontroller 将无法连接。这包括使用
jpenable 启用分析但未带 offline
参数的情况。如果启用离线模式,则会指定配置文件设置, jpcontroller 即可使用。
有关 jpenable 和 jpcontroller 可执行文件的更多信息,请参阅命令行参考。







