JProfiler架构
下面给出了涉及被分析应用程序、JProfiler UI和所有命令行实用程序的所有重要交互全貌,。
分析代理
"JVM工具接口"(JVMTI)是一个本地接口,分析器使用它来获取信息,并添加钩子来插入自己的Instrumentation。 这意味着至少有部分分析代理必须使用本地代码实现,因此JVM分析器不是独立于平台的。 JProfiler支持一系列平台,这些平台在网站上都有列出。
JVM分析器作为一个本地库实现,它可以在启动时加载,也可以在稍后的某个时间点加载。
要在启动时加载,需要在命令行中添加一个VM参数-agentpath:<本地库的路径>
。
你很少需要手动添加这个参数,因为JProfiler会自动为你添加,例如在IDE集成中,集成向导中或者直接启动JVM。
然而,重要的是知道,这是实现分析的原理。
如果JVM成功加载了本地库,它就会调用库中的一个特殊函数,让分析代理可以初始化自己。
然后JProfiler会打印几条以<JProfiler>
为前缀的诊断信息,这样你就知道分析已经激活。
重要的是,如果你传递了-agentpath
VM参数,分析代理要么成功加载,要么JVM不启动。
一旦加载,分析代理就会要求JVMTI通知各种事件,如线程创建或类加载。其中一些事件直接提供分析数据。 使用类加载事件,分析代理在类被加载时对它们进行Instrument,并插入自己的字节码来执行其测量。
JProfiler可以将代理加载到已经运行的JVM中,可以使用JProfiler UI,也可以通过 命令行工具。
在这种情况下,为了应用要求的Instrumentation,可能需要重新转换大量已经加载的类。
bin/jpenable
记录数据
JProfiler代理只收集分析数据。JProfiler UI是单独启动的,并通过Socket连接到分析代理。 这意味着,实际上,被分析的JVM是在本地机器上还是在远程机器上运行无关紧要--分析代理和JProfiler UI之间的通信机制总是相同的。
从JProfiler UI,你可以通知代理记录数据,在UI中显示分析数据,并将快照保存到磁盘。作为UI的替代方案,
你也可以通过MBean来控制分析代理。
使用MBean的命令行工具是 。
bin/jpcontroller
然而,控制分析代理的另一种方法是使用一组预定义的触发器和操作。通过这种方式,分析代理可以在无人看管的模式下运行。 这在JProfiler中被称为"离线分析",对于自动分析会话非常有用。
快照
虽然JProfiler UI可以显示实时分析数据,但经常需要保存记录所有分析数据的快照。 快照可以在JProfiler UI中手动保存,也可以通过触发器操作自动保存。
快照可以在JProfiler UI中打开和比较。对于自动化处理,命令行工具
和 bin/jpexport
可以用来从先前保存的快照中提取数据和创建 HTML 报告。
bin/jpcompare
从正在运行的JVM中获取堆快照的一种低开销方式是使用命令行工具。
它使用JVM的内置功能来保存HPROF快照,该快照可以被JProfiler打开,并且不需要加载分析代理。
bin/jpdump