JProfiler架构


下面给出了涉及被分析应用程序、JProfiler UI和所有命令行实用程序的所有重要交互全貌,。

远程或本地本地被分析 JVM JProfilerMBeanjpcontroller 发布通过socket连接通过JMX连接使用 -agentpath加载使用离线分析控制jpenablejpdump命令行参数jpexportjpcomparejpanalyze传输数据生成HPROF堆转储通过Attach加载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,也可以通过bin/jpenable 命令行工具。 在这种情况下,为了应用要求的Instrumentation,可能需要重新转换大量已经加载的类。

记录数据

JProfiler代理只收集分析数据。JProfiler UI是单独启动的,并通过Socket连接到分析代理。 这意味着,实际上,被分析的JVM是在本地机器上还是在远程机器上运行无关紧要--分析代理和JProfiler UI之间的通信机制总是相同的。

从JProfiler UI,你可以通知代理记录数据,在UI中显示分析数据,并将快照保存到磁盘。作为UI的替代方案, 你也可以通过MBean来控制分析代理。 使用MBean的命令行工具是bin/jpcontroller

然而,控制分析代理的另一种方法是使用一组预定义的触发器和操作。通过这种方式,分析代理可以在无人看管的模式下运行。 这在JProfiler中被称为"离线分析",对于自动分析会话非常有用。

快照

虽然JProfiler UI可以显示实时分析数据,但经常需要保存记录所有分析数据的快照。 快照可以在JProfiler UI中手动保存,也可以通过触发器操作自动保存。

快照可以在JProfiler UI中打开和比较。对于自动化处理,命令行工具bin/jpexportbin/jpcompare 可以用来从先前保存的快照中提取数据和创建 HTML 报告。

从正在运行的JVM中获取堆快照的一种低开销方式是使用bin/jpdump命令行工具。 它使用JVM的内置功能来保存HPROF快照,该快照可以被JProfiler打开,并且不需要加载分析代理。