使用 JFR 查找 CPU 负载 - 一口 Java

您的 Java 应用程序中 CPU 负载异常高,遇到问题了吗?JFR 可以帮助您追踪消耗 CPU 的内容!我们来看看!

JDK Flight Recorder

JDK Flight Recorder,通常称为 JFR,是一个直接内置于 JDK 中的可观察性和监控框架!自 JDK 11(JFR 开源并更名为JDK Flight Recorder,以前称为Java)以来,它在生产中也是免费使用的。这使得 JFR 成为追踪应用程序为什么像 CPU 一样占用资源的隐秘问题的绝佳选择。

记录实时应用程序

第一步是捕获应用程序的记录。幸运的是,由于 JFR 内置于 JDK 中,因此可以在已经运行的应用程序上启动它!当您看到资源使用突然激增但希望在重新启动应用程序之前捕获可能出错的内容时,这非常有用。

要开始记录应用程序,您将使用 jcmd 命令

$ jcmd <pid> JFR.start

您需要您要监控的 JVM 的 PID。可以使用 jps 找到它。

JFR.start 可以采用许多可选参数,例如 name,如果您想从另一个已经运行的记录中启动一个单独的记录。

接下来,我们需要使用 JFR.dump 从应用程序获取记录数据。

$ jcmd <pid> JFR.dump [filename={path}]

参数 filename 是可选的,但强烈建议使用比 JFR 提供的默认名称更令人难忘的名称。filename 的路径相对于被监控的 JVM 的路径,而不是 jcmd 被执行的目录。

从启动记录应用程序

JFR 也可以在启动时使用以下方式初始化

$ java -XX:StartFlightRecording[=args]

它可以采用多个参数,请务必查看附加阅读部分以了解我。

使用 JDK Mission Control 分析记录

JDK Mission Control (JMC) 是一个用于分析 JFR 记录的开源工具。在 JMC 中打开我们刚刚捕获的 JFR 记录,然后转到页面左下角的事件浏览器。

在事件浏览器页面上,滚动到接近底部,在处理器文件夹下,到线程 CPU 负载,右键单击,然后选择“使用选定的事件类型创建新页面”。

打开新创建的线程 CPU 负载页面,该页面应该可以在屏幕左下角的事件浏览器下找到。

为了更易于阅读,通过右键单击事件列表中的任意位置并选择下拉菜单中的按组事件线程,按事件线程对事件进行分组。

百分比基于总 CPU 的利用率。在我的案例中,我有一个 6 核超线程 CPU,因此 ~3% 的利用率表示其中一个线程约 50% 的利用率。在此示例中,我正在运行一个简单的无穷斐波那契序列。

使用 JFR 视图

jfr view 命令已在 JDK 21 中添加,它允许直接从命令行更轻松地访问此信息!

使用录制,运行以下命令

$ jfr view thread-cpu-load [recording-file]

将打印以下表格

                                Thread CPU Load

Thread                                                             System  User
------------------------------------------------------------------ ------ -----
CPU_LOAD_GENERATOR                                                  1.60% 3.29%
DestroyJavaVM                                                       0.01% 0.11%
JFR Periodic Tasks                                                  0.00% 0.00%
Attach Listener                                                     0.00% 0.00%
C1 CompilerThread0                                                  0.00% 0.00%
C2 CompilerThread0                                                  0.00% 0.00%
Monitor Deflation Thread                                            0.00% 0.00%
Service Thread                                                      0.00% 0.00%
JFR Recorder Thread                                                 0.00% 0.00%

其他阅读材料

Java 命令

视图命令

编码愉快!