JProfiler帮助文档Download

使用JProfiler记录JFR快照


由于在生产JVM中运行JFR的好处是开销最小且无需启用分析接口,JProfiler在UI中直接支持JFR记录。 虽然您可以通过编程方式启动JFR或在命令行中添加-XX:StartFlightRecording VM参数, 但JProfiler可以帮助您启动和停止已运行JVM的记录。

当您使用JProfiler附加到JVM时,您可以选择启动和停止JFR记录,而不是加载本机分析代理。 借助JProfiler广泛的远程连接功能,您可以在不修改容器的情况下,例如在Docker或Kubernetes容器中运行的JVM中启动JFR记录。

启动和停止JFR记录

在启动中心的"Quick attach"选项卡上,选择一个JVM并点击对话框底部的Start JFR按钮。 屏幕截图中显示的是本地运行的JVM,但当您附加到远程JVM时,同样的按钮也可用。

在JFR设置向导中,您可以选择从所选进程使用的JRE的lib/jfr目录中传输的事件设置模板之一。 默认情况下,有两个这样的模板,"default"和"profile",其中"profile"记录更多数据并增加更多开销。 如果您在该目录中创建其他文件,您将能够在向导中选择相应的模板。

这些模板文件包含可用事件以及重要高级设置的配置指令。每个高级设置可以与多个不同的事件关联。 此UI是根据模板文件的内容动态生成的。在不同的配置文件之间切换将向您显示不同的默认值。 还有许多事件类型未包含在此UI中,仅在下一步中可配置。

如果您已经为具有相同事件类型集的JVM启动了JFR记录,JProfiler将为您提供使用上次设置的选项。

如果您选择该选项,高级记录设置将不可用,您可以继续下一步查看整个配置并进行进一步更改。

向导此步骤中的另一个重要设置是最大快照大小。由于JFR记录的性质,快照的大小可能会迅速增加,可能会填满您的整个硬盘。 为了避免这种情况,最大快照大小限制可以防止过度的存储利用。当达到最大大小时,旧事件将被丢弃,而新事件将继续被记录。 此过程是JFR的自动机制。

在向导的下一步中,您可以看到所有事件类型的分类树,并在右侧进行进一步的配置。

事件可能有一个周期、一个阈值和一个标志,用于指示是否为每个事件记录堆栈跟踪。 周期和阈值都是带有时间单位的设置,您可以按down键获取可用单位的自动完成弹出窗口。 周期还支持特殊值"everyChunk"、"beginChunk"和"endChunk",这些值也可以从自动完成弹出窗口中获得。 "chunk"指的是JFR记录的一部分,其中包含一组连续的事件数据和元数据,并作为记录中的基本存储和数据传输单元。

树中选择的事件越多,记录的数据就越多。有些事件类型会生成大量数据,而有些则只生成少量事件。

与完整分析模式或"Heap dump only"模式不同,在这些模式下,您可以立即在UI中看到一些数据,启动JFR快照仅会在未选择时修改JVM在表中的背景颜色, 以便您可以看到JProfiler已开始记录。当选择JVM时,底部的JFR按钮文本现在会显示您将停止记录。

当您停止由JProfiler启动的JFR记录时,JFR快照将被传输并在JProfiler中打开。快照是临时的,关闭窗口时将被删除。 要将快照保存到永久位置,请使用工具栏中的"Save snapshot"操作。

具有JFR记录的终止JVM

JFR的一个提到的用途是调查崩溃前的时刻。在这种情况下,JVM将不再在JVM表中可用以停止JFR记录并打开JFR快照。 如果在JProfiler中启动了JFR记录,并且在您停止记录之前JVM终止,则将在JVM表中添加一个以"Terminated JFR:"为前缀的特殊条目。 通过双击该条目或使用"JFR"按钮,您可以打开JFR快照。

一旦您打开这样的条目,它将从列表中删除。与手动停止的记录一样,打开的JFR快照将是临时的,如果您想保留以供以后分析,您必须保存它。

显示外部启动的JFR记录

在上面的示例中,JFR记录是在JProfiler中启动和停止的。外部启动的JFR记录也可以显示。 可以通过类似的VM参数轻松启动连续的JFR记录

"-XX:StartFlightRecording=maxsize=500m=filename=$TEMP/myapp.jfr,name=Continuous recording"

JVM表中的特殊背景颜色指示JFR记录正在运行仅指的是在JProfiler中启动的JFR记录。 如果您连接到通过其他方式启动JFR记录的JVM,将显示另一个对话框。

您现在可以选择在JProfiler中启动新记录或转储现有记录并在JProfiler中显示生成的JFR快照。 外部启动的JFR记录具有独立的生命周期,不会被JProfiler停止。