Java 11 新特性之 飞行记录器(JFR)

Java 11 引入了 飞行记录器(Java Flight Recorder, JFR) ,这是一个强大的性能监控和故障排查工具。JFR 最初是 Oracle JDK 的一个商业特性,但在 Java 11 中被开源并集成到了 OpenJDK 中。它允许开发者以低开销的方式收集 JVM 和应用程序的运行时数据,从而帮助诊断性能问题、内存泄漏以及其他运行时异常。

以下是关于 Java 11 中 JFR 的关键功能和使用方法:


1. 什么是 Java Flight Recorder?

Java Flight Recorder 是一个内置的性能分析工具,能够以极低的性能开销(通常低于 1%)实时收集 JVM 和应用程序的运行时信息。这些信息包括但不限于:

  • 线程活动
  • 垃圾回收事件
  • 内存分配
  • 锁争用
  • 文件 I/O 操作
  • 网络活动
  • 自定义事件

JFR 的设计目标是提供一种高效且轻量级的方式来监控生产环境中的应用程序,而不会对性能造成显著影响。


2. 启用 JFR

JFR 默认是禁用的,需要通过命令行参数启用。可以通过以下方式启动 JFR:

(1)通过命令行参数启用

在启动 JVM 时添加以下参数:

ruby 复制代码
java -XX:StartFlightRecording=filename=myrecording.jfr,duration=60s MyApplication

参数说明:

  • ​filename​:指定记录文件的名称。
  • ​duration​:指定记录持续的时间(例如 ​60s​ 表示 60 秒)。
  • 其他常用参数:
  • ​settings​:指定配置文件路径(例如 ​profile​​default​)。
  • ​delay​:延迟开始记录的时间。

(2)动态启用 JFR

如果 JVM 已经运行,可以通过 JMX 或 ​​jcmd​​ 工具动态启用 JFR。

使用 ​​jcmd​​ 启动记录:

ini 复制代码
jcmd <PID> JFR.start name=MyRecording settings=profile duration=60s filename=myrecording.jfr

解释:

  • ​<PID>​ 是目标 JVM 进程的进程 ID。
  • ​name​:为记录会话指定一个名称。
  • ​settings​:选择预定义的配置(如 ​profile​​default​)。
  • ​duration​​filename​ 同上。

3. 查看和分析 JFR 数据

JFR 收集的数据存储在一个 ​​.jfr​​ 文件中,可以使用 Java Mission Control (JMC) 工具进行查看和分析。

(1)安装 JMC

  • 如果你使用的是 Oracle JDK,JMC 通常已经包含在内。
  • 如果你使用的是 OpenJDK,可以从 ​OpenJDK 官方网站​ 下载 JMC。

(2)加载 JFR 文件

启动 JMC 并打开 ​​.jfr​​ 文件:

复制代码
jmc myrecording.jfr

JMC 提供了一个直观的用户界面,可以查看各种性能指标和事件,例如:

  • CPU 使用率
  • 垃圾回收事件
  • 线程状态
  • 内存分配情况
  • 锁争用情况

4. 自定义事件

除了内置的事件类型,开发者还可以通过 JFR API 创建自定义事件,用于记录应用程序特定的行为。

示例:创建自定义事件

scala 复制代码
import jdk.jfr.Event;
import jdk.jfr.Description;
import jdk.jfr.Label;

@Label("Custom Event")
@Description("An example of a custom JFR event")
class CustomEvent extends Event {
    @Label("Message")
    String message;

    @Label("Value")
    int value;
}

public class JFRExample {
    public static void main(String[] args) throws InterruptedException {
        // 记录自定义事件
        CustomEvent event = new CustomEvent();
        event.message = "Hello, JFR!";
        event.value = 42;
        event.commit();

        Thread.sleep(1000); // 模拟一些工作
    }
}

解释:

  • ​@Label​​@Description​ 用于为事件和字段添加元数据。
  • 调用 ​commit()​ 方法将事件记录到 JFR 中。

5. JFR 的优势

  1. 低开销
  • JFR 的设计使其对应用程序的性能影响非常小,适合在生产环境中使用。
  1. 全面的监控能力
  • 能够捕获 JVM 和应用程序的几乎所有运行时信息。
  1. 灵活的配置
  • 可以根据需求调整记录的内容和频率。
  1. 易于使用
  • 提供了简单的命令行工具和图形化分析工具(JMC),降低了使用门槛。

6. 使用场景

JFR 在以下场景中非常有用:

  1. 性能调优
  • 分析应用程序的瓶颈,例如高 CPU 使用率、频繁的垃圾回收等。
  1. 故障排查
  • 定位生产环境中的异常行为,例如死锁、内存泄漏等。
  1. 长期监控
  • 在生产环境中持续监控应用程序的健康状况。
  1. 开发调试
  • 在开发阶段发现潜在的性能问题。

7. 总结

Java Flight Recorder 是 Java 11 中引入的一项重要功能,为开发者和运维人员提供了一种高效、低开销的方式来监控和诊断应用程序的运行时行为。通过 JFR,你可以轻松捕获 JVM 和应用程序的关键指标,并利用 JMC 工具进行深入分析。

相关推荐
求知若渴,虚心若愚。3 分钟前
ansible.cfg 配置文件生成
java·服务器·ansible
雪域迷影4 分钟前
使用AssemblyAI将音频数据转换成文本
java·音视频·restapi·gson·assemblyai
CF14年老兵24 分钟前
2025 年每个开发人员都应该知道的 6 个 VS Code AI 工具
前端·后端·trae
think12324 分钟前
带你走进Spring Cloud的世界
spring boot·后端·spring cloud
没逻辑1 小时前
Goroutine 死锁定位与调试全流程
后端
IH_LZH1 小时前
kotlin小记(1)
android·java·前端·kotlin
无限大61 小时前
Java 随机数生成:从青铜到王者的骚操作指南
后端·程序员
Java技术小馆1 小时前
MCP是怎么和大模型交互
前端·面试·架构
二闹1 小时前
后端开发:这5个技巧让你少写一半代码!
java·后端·project lombok
smileNicky1 小时前
SpringBoot系列之集成EasyExcel实现百万级别的数据导入导出实践
java