0Pricing
Java Academy · 课时

Java Flight Recorder

低开销性能分析

Java Flight Recorder 是 CoddyKit 上的免费 Java Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

什么是 JFR

Java 飞行记录器(JFR)是直接内置于 JVM 的性能分析和事件收集引擎。

它会将详细的运行时事件——方法采样、对象分配、垃圾回收、锁、IO——记录到二进制 .jfr 文件中,同时保持极低的开销。它随 JDK 一起提供,无需额外代理。

为什么低开销很重要

传统的插桩式性能分析器可能会让应用变慢 2 倍甚至更多,从而扭曲您想要测量的时间。

JFR 的设计目标是在生产环境中运行,通常只产生约 1% 的开销。这意味着您可以让它持续运行,在真实事件发生时捕获记录,而不只是在实验室中进行。

在启动时开始记录

启动应用时,使用 JVM 标志启用 JFR:

  • -XX:StartFlightRecording=duration=60s,filename=app.jfr

这会记录持续 60 秒的事件,然后将其写入 app.jfr。您也可以启动一个一直运行到 JVM 退出的记录。

使用 jcmd 控制

您还可以使用 jcmd 在运行中的 JVM 上开始、停止和导出记录:

  • jcmd <pid> JFR.start name=rec settings=profile
  • jcmd <pid> JFR.dump name=rec filename=out.jfr
  • jcmd <pid> JFR.stop name=rec

对于已经出现异常的进程,这种方式非常适合抓取快照。

设置:默认与性能分析

JFR 随附两种内置配置:

  • 默认 — 开销最低,适合在生产环境中持续使用。
  • 性能分析 — 采样更详细,开销略高,适合进行有针对性的调查。

使用 settings=profile 进行选择。您还可以编写自定义 .jfc 配置,以调整单个事件。

JFR 记录的内容

JFR 会捕获丰富的事件,包括:

  • 执行采样(CPU 时间花在哪里)。
  • 对象分配和 TLAB 活动。
  • 垃圾回收暂停。
  • 锁竞争(jdk.JavaMonitorWait)。
  • 文件和套接字 IO、线程停驻以及异常。

每个事件都有时间戳、持续时间和堆栈跟踪。

自定义事件

您可以定义自己的 JFR 事件,为业务逻辑计时。扩展 jdk.jfr.Event,为其添加注解,然后在工作开始和提交周围调用 begin() / commit()。

这是 JFR 应用程序接口中适合独立使用的部分。实际记录仍需要 JVM 标志,但事件类可以在任何 JDK 上编译并运行。

import jdk.jfr.Event;
import jdk.jfr.Label;

public class Main {
    @Label("Order Processing")
    static class OrderEvent extends Event {
        @Label("Order Id") int orderId;
    }

    public static void main(String[] args) {
        OrderEvent e = new OrderEvent();
        e.orderId = 42;
        e.begin();
        // ... do the work being measured ...
        e.commit();
        System.out.println("Custom JFR event committed for order " + e.orderId);
    }
}

持续记录

对于长期运行的服务,请使用有大小或时间上限的持续记录(环形缓冲区)。

新事件到达时会丢弃旧事件,因此磁盘使用量始终受控。发生事件时,您可以导出缓冲区,立即获得事件发生前几分钟的数据。

退出时导出

将 dumponexit=true 添加到启动飞行记录的标志中,JFR 就会在 JVM 关闭时写入缓冲区。

将其与 -XX:FlightRecorderOptions 结合使用可以设置缓冲区大小。这样可以确保即使进程即将终止,也能捕获数据。

读取文件

.jfr 文件是二进制文件。您可以在JDK 任务控制中以可视化方式分析它(下一课介绍),也可以通过 jdk.jfr.consumer 应用程序接口和 RecordingFile 以编程方式分析。

命令行 jfr print app.jfr 也可以将事件导出为文本,便于快速搜索。

实时流式传输事件

从 JDK 14 开始,JFR 支持通过 jdk.jfr.consumer.RecordingStream 应用程序接口进行事件流式传输。

您无需导出文件后再打开,而是可以订阅事件并在其发生时实时响应——例如,当垃圾回收暂停超过阈值时发出警报。这使 JFR 成为实时监控数据源,而不仅是事后分析工具。

快速检查

JFR 可以在生产环境中持续运行的主要原因是什么?

回顾

JFR 是 JVM 内置的飞行数据记录器:

  • 以低开销、适合生产环境的方式将事件收集到 .jfr 文件中。
  • 通过 -XX:StartFlightRecording 或 jcmd JFR.start 启动。
  • 选择默认或性能分析设置;定义自定义事件。
  • 使用持续的环形缓冲区记录和 dumponexit。
  • 接下来在 JDK 任务控制中进行分析。

常见问题解答

「Java Flight Recorder」课时是免费的吗?

是的 — 「Java Flight Recorder」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「Java Flight Recorder」这节课中我会学到什么?

低开销性能分析 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「Java Flight Recorder」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 识别瓶颈
  2. Java Flight Recorder
  3. 使用 JDK Mission Control 分析
  4. 常见 JVM 调优标志
← 返回 Java Academy