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

358 阅读4分钟

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 时添加以下参数:

java -XX:StartFlightRecording=filename=myrecording.jfr,duration=60s MyApplication

参数说明:

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

(2)动态启用 JFR

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

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

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 创建自定义事件,用于记录应用程序特定的行为。

示例:创建自定义事件

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 工具进行深入分析。