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

相关推荐
一只叫煤球的猫24 分钟前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 小时前
tcp/ip 中的多路复用
后端
bobz9651 小时前
tls ingress 简单记录
后端
皮皮林5512 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友2 小时前
什么是OpenSSL
后端·安全·程序员
bobz9652 小时前
mcp 直接操作浏览器
后端
前端小张同学5 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康6 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在6 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net