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

相关推荐
陈随易12 分钟前
10年老前端,分享20+严选技术栈
前端·后端·程序员
汪子熙22 分钟前
计算机世界里的 blob:从数据库 BLOB 到 Git、Web API 与云存储的二进制宇宙
后端
程序猿不脱发225 分钟前
聊聊负载均衡架构
运维·架构·负载均衡
十八旬26 分钟前
苍穹外卖项目实战(日记十)-记录实战教程及问题的解决方法-(day3-2)新增菜品功能完整版
java·开发语言·spring boot·mysql·idea·苍穹外卖
鞋尖的灰尘41 分钟前
springboot-事务
java·后端
元元的飞43 分钟前
6、Spring AI Alibaba MCP结合Nacos自动注册与发现
后端·ai编程
Cisyam1 小时前
Go环境搭建实战:告别Java环境配置的复杂
后端
银迢迢1 小时前
SpringCloud微服务技术自用笔记
java·spring cloud·微服务·gateway·sentinel
六月的雨在掘金1 小时前
狼人杀法官版,EdgeOne 带你轻松上手狼人杀
前端·后端
用户0332126663671 小时前
Java 将 CSV 转换为 Excel:告别繁琐,拥抱高效数据处理
java·excel