离线分析
使用 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>
和仓库
https://maven.ej-technologies.com/repository
如果在应用程序的正常执行期间使用分析 API,API 调用将静默地不执行任何操作。
这种方法的缺点是您必须在开发期间将 JProfiler 代理库添加到应用程序的类路径中,将分析指令添加到源代码中,并在每次更改编程分析操作时重新编译代码。
触发器
使用 触发器,您可以在不修改源代码的情况下在 JProfiler GUI 中指定所有分析操作。触发器保存在 JProfiler 配置文件中。当您在启用离线分析的情况下启动时,配置文件和会话 ID 会通过命令行传递给分析代理,以便分析代理可以读取这些触发器定义。
与分析 API 不同,您需要在源代码中添加 API 调用,触发器是在 JVM 中发生某个事件时激活的。例如,您可以使用方法调用触发器,而不是在方法的开始或结束时为某个分析操作添加 API 调用。作为另一种用例,您可以使用计时器触发器,而不是创建自己的计时器线程来定期保存快照。
每个触发器都有一个动作列表,当关联的事件发生时执行这些动作。其中一些动作对应于控制器 API 中的分析动作。此外,还有其他超出控制器功能的动作,例如打印带参数和返回值的方法调用的动作或调用方法拦截器脚本的动作。
配置离线分析
如果您在 JProfiler 中配置了一个启动会话,可以通过从主菜单中调用 会话→转换向导→将应用程序会话转换为离线 将其转换为离线会话。这将创建一个带有适当 VM 参数的启动脚本,并从您在 JProfiler UI 中使用的相同会话中获取分析设置。如果您想将调用移动到另一台计算机,您必须使用 会话→导出会话设置 将会话导出到配置文件,并确保启动脚本中的 VM 参数引用该文件。
当使用集成向导分析应用服务器时,总是会修改一个启动脚本或配置文件,以便将分析的 VM 参数插入到 Java 调用中。所有集成向导在“启动”步骤中都有一个“离线分析”选项,以便为离线分析而不是交互式分析配置应用服务器。
您可能希望自己将 VM 参数传递给 Java 调用,例如,如果您有一个不由集成向导处理的启动脚本。该 VM 参数的格式为
-agentpath:<path to jprofilerti library>=offline,id=<ID>[,config=<path>]
并且可以从 [Generic application]
向导中获得。
将 offline
作为库参数传递可以启用离线分析。在这种情况下,无法与 JProfiler GUI 连接。session
参数决定了配置文件中哪个会话应被用于分析设置。会话的 ID 可以在会话设置对话框的 应用程序设置 选项卡的右上角看到。可选的 config
参数指向配置文件。您可以通过调用
会话→导出会话设置 导出该文件。如果省略该参数,将使用标准配置文件。该文件位于用户主目录中的 .jprofiler15
目录中。
使用 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 启用离线分析
使用命令行工具 ,您可以在任何版本为 8 或更高的运行中的 JVM 中启动离线分析。就像 VM 参数一样,您必须指定
bin/jpenable
offline
开关、会话 ID 和可选的配置文件:
jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml
通过这样的调用,您必须从运行中的 JVM 列表中选择一个进程。通过附加参数 --pid=<PID> --noinput
,您可以自动化该过程,使其完全不需要用户输入。
另一方面,当即时启用离线分析时,可能需要手动启动一些记录或保存快照。这可以通过 命令行工具实现。
bin/jpcontroller
如果仅加载了分析代理,但没有应用分析设置,则无法开启任何记录操作,因此 将无法连接。这包括使用
jpcontroller
启用分析的情况,但没有 jpenable
offline
参数。如果启用离线模式,则指定了分析设置,并且可以使用
。
jpcontroller
有关 和 jpenable
可执行文件的更多信息,请参阅 jpcontroller命令行参考。