离线分析
分析一个应用程序,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>]
并可从[通用应用程序]
向导中获得。
传递offline
作为库参数可以实现离线分析。在这种情况下,无法与JProfiler GUI连接。
session
参数决定了配置文件中的哪个会话应被用于分析设置。
会话的ID可以在会话设置对话框中应用程序设置选项卡的右上角看到。
可选的config
参数指向配置文件。
这个文件,可以通过调用会话→导出会话设置导出。
如果省略该参数,将使用标准配置文件。该文件位于用户主目录下的.jprofiler14
目录下。
使用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
任务对任何Java类进行分析,
其方式与你用标准的JavaExec
任务执行它的方式相同。如果你使用JProfiler不直接支持的其他方法启动JVM,
com.jprofiler.gradle.SetAgentPathProperty
任务可以将所需的VM参数写入一个属性。
在应用JProfiler插件时,它会被默认添加,因此你可以简单地写入:
setAgentPathProperty { propertyName = 'agentPathProperty' offline = true configFile = file("path/to/jprofiler_config.xml") sessionId = 1234 }
然后在任务执行后,在其他地方使用agentPathProperty
作为项目属性引用。
所有Gradle任务和相应的Ant任务的功能在单独章节中都有详细介绍。
为正在运行的JVM启用离线分析
通过命令行实用程序,
你可以在任何正在运行的版本为1.6或更高的JVM中启动离线分析。就像VM参数一样,你必须指定一个 bin/jpenable
offline
开关、
一个会话ID和一个可选的配置文件。
jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml
以这种方式调用,你必须从正在运行的JVM列表中选择一个进程。
通过附加参数--pid=<PID> --noinput
other,你可以自动化处理,这样就完全不需要用户输入。
另一方面,当在运行中启用离线分析时,可能需要手动启动一些记录或保存快照。
这可以通过 命令行工具实现。
bin/jpcontroller
如果仅加载了分析代理,但没有应用分析设置,则无法打开任何记录操作,
因此 将无法连接。
这包括通过 jpcontroller
启用分析,但没有 jpenable
offline
参数的情况。
如果你启用了离线模式,并指定了分析设置,则可以使用 。
jpcontroller
关于 和 jpenable
可执行文件的更多信息可在 jpcontroller命令行参考中获得。