JProfiler帮助文档

离线分析


分析一个应用程序,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参数指向配置文件。 这个文件,可以通过调用会话->导出会话设置导出。 如果省略该参数,将使用标准配置文件。该文件位于用户主目录下的.jprofiler12 目录下。

使用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启用离线分析

通过命令行实用程序bin/jpenable, 你可以在任何正在运行的版本为1.6或更高的JVM中启动离线分析。就像VM参数一样,你必须指定一个offline 开关、 一个会话ID和一个可选的配置文件。

jpenable --offline --id=12344 --config=/path/to/jprofiler_config.xml

以这种方式调用,你必须从正在运行的JVM列表中选择一个进程。 通过附加参数--pid=<PID> --noinput other,你可以自动化处理,这样就完全不需要用户输入。

另一方面,当在运行中启用离线分析时,可能需要手动启动一些记录或保存快照。 这可以通过bin/jpcontroller 命令行工具实现。

如果仅加载了分析代理,但没有应用分析设置,则无法打开任何记录操作, 因此jpcontroller 将无法连接。 这包括通过jpenable启用分析,但没有offline参数的情况。 如果你启用了离线模式,并指定了分析设置,则可以使用jpcontroller

关于jpenablejpcontroller 可执行文件的更多信息可在命令行参考中获得。