什么是JFR

Java Flight Recorder (JFR) 是 Java 虚拟机 (JVM) 中的一个事件记录器,它能够记录运行时的各种信息,如方法调用、垃圾回收、线程活动等,用于监控和调优 Java 应用程序的性能。使用 Java Flight Recorder,可以轻松地收集和分析应用程序在生产环境中的运行时信息,以便更好地理解应用程序的行为、性能瓶颈和潜在问题。它提供了丰富的事件类型,可以捕获各种级别的信息,从 JVM 内部的细节到应用程序级别的指标都可以覆盖。这些事件可以导出为 JFR 文件,然后可以使用 JMC 或其他工具对其进行分析。

关键概念

事件

JFR 收集 Java 应用程序运行时 JVM 中发生的事件。这些事件与JVM本身的状态或者程序的状态有关。事件具有名称、时间戳和附加信息(如线程信息、执行堆栈和堆状态)。

JFR收集三种类型的事件

  • 即时事件一旦发生就会立即记录
  • 如果持续时间超过指定阈值,则记录持续时间事件
  • 样本事件用于对系统活动进行采样

数据流

JFR 收集的事件包含大量数据。因此,JFR 的数据导出被设计为异步执行,不会妨碍程序。
JFR 将有关事件的数据保存在单个输出文件Flight.jfr 中。
众所周知,磁盘 I/O 操作的开销相当大。因此,JFR 在将数据块刷新到磁盘之前使用各种缓冲区来存储收集到的数据。由于在同一时刻,一个程序可能有多个具有不同选项的注册进程。因此,我们可能会在输出文件中发现比请求的数据更多的数据,或者可能不按时间顺序排列。但如果我们使用 JMC,我们甚至可能不会注意到这一事实,因为它按时间顺序可视化事件。
在极少数情况下,JFR 可能无法刷新数据(例如,事件太多或停电时)。如果发生这种情况,JFR 会尝试通知我们输出文件可能缺少一段数据。

特性

JFR具有以下关键特性:

  1. 低开销的持续性能监控: JFR 可以在生产环境中以低开销的方式持续地监控 JVM 的性能,旨在尽可能少地影响正在运行的应用程序的性能。它通过轻量级的事件采集机制来收集数据,几乎不会对应用程序的性能产生影响。
  2. 丰富的事件数据: JFR 可以收集丰富的事件数据,包括 CPU 使用情况、内存分配情况、线程活动、垃圾收集情况、锁竞争、I/O 操作等。基于事件采集可以分析非常底层的信息,例如对象分配,方法采样与热点方法定位与调用堆栈,安全点分析与锁占用时长与堆栈分析,GC 相关分析以及 JIT 编译器相关分析
  3. 低延迟的数据记录: JFR 使用异步方式记录事件数据,因此几乎不会对应用程序的性能产生明显的影响。它能够以很低的延迟记录事件,即使在高负载的情况下也能保持高效率。
  4. 动态配置: JFR 允许用户在运行时动态地配置数据采集和记录行为。可以通过 JFR 控制台或者命令行工具来启动、停止、配置和导出录制会话。
  5. 完善的API定义:用户可以自定义事件生产与消费。

使用

为了使用JFR,我们可以通过两种方式来激活它:

  1. 当启动 Java 应用程序时,通过命令行传递参数启动
  2. 当 Java 应用程序已在运行时,传递jcmd工具的诊断命令
    JFR停止收集后,可以获得本次收集的jfr文件,将该文件提供给可视化工具(例如JMC,Java Mission Control),就可以以直观的方式可视化有关事件的数据,从而准确分析程序的性能瓶颈

命令行启动

使用javac将.java文件编译为.class文件后,可以使用以下命令启动JFR:

1
2
3
//path-to-class-file 是应用程序的入口点_*.class_文件。
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder
-XX:StartFlightRecording=duration=200s,filename=flight.jfr path-to-class-file

此命令启动应用程序并激活JFR,记录立即开始,持续时间不超过 200 秒。收集的数据保存在输出文件 Flight.jfr 中。

jcmd工具

1
2
jcmd <pid|MainClass> <command> [parameters]
eg: jcmd 1234 JFR.start duration=100s filename=flight.jfr

<command>包括:

  • JFR.start  – 开始新的 JFR 录制
  • JFR.check  – 检查正在运行的 JFR 记录
  • JFR.stop  – 停止特定的 JFR 录制
  • JFR.dump  – 将 JFR 记录的内容复制到文件
    每个命令都有一系列参数,具体可参考Java Flight Recorded 官方文档