JProfiler帮助文档

使用 JProfiler 记录 JFR 快照

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

当您使用 JProfiler attach 到 JVM 时,可以选择启动和停止 JFR 记录,而不是加载原生 Profiling Agent。 借助 JProfiler 广泛的远程 (remote) 连接能力,您可以在运行于 Docker 或 Kubernetes 容器 (container) 中的 JVM 内启动 JFR 记录, 而无需修改容器 (container)。

启动和停止 JFR 记录

在起始中心的“Quick Attach”选项卡上,选择一个 JVM 并单击对话框底部的 Start JFR 按钮。 截图展示了本地运行的 JVM,但当您 attach 到远程 (remote) JVM 时,该按钮同样可用。

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

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

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

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

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

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

事件可能包含周期 (period)、阈值 (threshold)设置,以及是否为每个事件记录堆栈跟踪 (stack trace)的标志。 周期和阈值都是带有时间单位的设置,您可以按 Down 键来获取可用单位的自动补全弹出菜单。 周期还支持特殊值“everyChunk”、“beginChunk”和“endChunk”,这些值也可以从自动补全弹出菜单中获取。 “chunk”指的是 JFR 记录的一部分,它包含一组连续的事件数据和元数据,并作为记录中存储和数据传输的基本单位。

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

与可以在 UI 中立即看到某些数据的完整 Profiling 模式或“Heap dump only”模式不同, 启动 JFR 快照时,若 JVM 未被选中,则仅修改表格中该 JVM 的背景颜色,以便您能看到 JProfiler 已启动记录。 当选中该 JVM 时,底部的 JFR 按钮文本现在会指示记录将被停止。

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

带有 JFR 记录的已终止 JVM

JFR 的一个常见用途是调查崩溃前的时刻。在这种情况下,JVM 将不再出现在 JVM 表格中以供停止 JFR 记录并打开 JFR 快照。 如果已经在 JProfiler 中启动了 JFR 记录,而 JVM 在您停止记录之前终止,则会在 JVM 表格中添加一个以“Terminated JFR:”为前缀的特殊条目。 通过双击该条目或使用“Open Snapshot”按钮,您可以打开 JFR 快照。

一旦您打开此类条目,它就会从列表中移除。就像手动停止的记录一样,打开的 JFR 快照将是临时的,如果您想保留它以供后续分析,则必须将其保存。

显示外部启动的 JFR 记录

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

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

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

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