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=profilejcmd <pid> JFR.dump name=rec filename=out.jfrjcmd <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 反馈 — 无需本地设置。
此课程中的所有课时
- 识别瓶颈
- Java Flight Recorder
- 使用 JDK Mission Control 分析
- 常见 JVM 调优标志