跳到主要内容

JFR

Java Flight Recorder(JFR)是Java虚拟机(JVM)内置的性能分析工具,用于收集和分析Java应用程序的运行时数据。JFR能够以极低的性能开销记录应用程序的运行状态,帮助开发者和运维人员诊断性能问题、内存泄漏、线程争用等。

1. JFR 的核心概念​

  • 事件(Event):JFR 通过记录各种事件来捕获应用程序的运行状态。事件可以是方法调用、垃圾回收、线程状态、锁争用等。
  • 记录(Recording):JFR 将事件存储在记录中,记录可以保存到文件中供后续分析。
  • 配置(Configuration):JFR 提供了多种预定义的配置,用于控制记录哪些事件以及记录的详细程度。用户也可以自定义配置。

2. JFR 的使用场景​

  • 性能分析:通过记录方法调用、CPU 使用率、内存分配等事件,分析应用程序的性能瓶颈。
  • 内存分析:记录垃圾回收事件、对象分配事件,帮助诊断内存泄漏和内存使用问题。
  • 线程分析:记录线程状态、锁争用事件,分析线程阻塞和死锁问题。
  • I/O 分析:记录文件 I/O、网络 I/O 事件,分析 I/O 性能问题。

3. JFR 的启用方式​

JFR 可以通过命令行参数、JMX API 或 JDK 工具(如 jcmd)启用。

3.1 命令行参数​

在启动 Java 应用程序时,可以通过以下命令行参数启用 JFR:

java -XX:+FlightRecorder -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar
  • -XX:+FlightRecorder:启用 JFR。
  • -XX:StartFlightRecording:启动一个记录,指定记录的持续时间(duration)和输出文件(filename)。

3.2 使用 jcmd 工具​

jcmd 是 JDK 提供的一个命令行工具,可以用于动态控制 JFR。

jcmd <pid> JFR.start duration=60s filename=myrecording.jfr
jcmd <pid> JFR.dump filename=myrecording.jfr
jcmd <pid> JFR.stop
  • JFR.start:启动一个记录。
  • JFR.dump:将当前记录保存到文件。
  • JFR.stop:停止记录。

3.3 使用 JMX API​

通过 JMX API,可以在运行时动态控制 JFR。以下是一个简单的示例:

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class JFRControl {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:12345/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(url);
MBeanServerConnection connection = connector.getMBeanServerConnection();

ObjectName jfr = new ObjectName("com.sun.management:type=FlightRecorder");
connection.invoke(jfr, "startRecording", new Object[]{null}, new String[]{String.class.getName()});
Thread.sleep(60000); // 记录 60 秒
connection.invoke(jfr, "stopRecording", new Object[]{}, new String[]{});
}
}

4. JFR 的分析工具​

JFR 记录的文件可以使用 JDK 自带的 jfr 工具或第三方工具进行分析。

4.1 使用 JDK Mission Control (JMC)​

JDK Mission Control 是 Oracle 提供的一个图形化工具,用于分析 JFR 记录文件。JMC 提供了丰富的视图和图表,帮助用户分析性能问题。

4.2 使用 jfr 命令行工具​

JDK 提供了 jfr 命令行工具,可以用于解析和分析 JFR 记录文件。

jfr print myrecording.jfr

jfr 工具可以将记录文件中的事件打印到控制台,方便用户查看。

5. JFR 的配置​

JFR 提供了多种预定义的配置,用户也可以自定义配置。配置文件是一个 XML 文件,定义了要记录的事件及其详细程度。

5.1 预定义配置​

JFR 提供了以下几种预定义配置:

  • default:默认配置,记录大多数事件。
  • profile:性能分析配置,记录更多的方法调用和 CPU 使用事件。
  • debug:调试配置,记录所有事件,详细程度最高。

5.2 自定义配置​

用户可以通过编辑 XML 文件自定义 JFR 配置。以下是一个简单的自定义配置示例:

<configuration version="2.0">
<event name="jdk.CPULoad">
<setting name="enabled">true</setting>
<setting name="threshold">10 ms</setting>
</event>
<event name="jdk.GarbageCollection">
<setting name="enabled">true</setting>
</event>
</configuration>

6. JFR 的性能开销​

JFR 的设计目标是以极低的性能开销记录事件。通常情况下,JFR 的性能开销在 1% 以下,适合在生产环境中使用。

7. JFR 的限制​

  • 事件丢失:在高负载情况下,JFR 可能会丢失部分事件。
  • 存储空间:长时间记录可能会生成较大的文件,需要足够的存储空间。

8. 总结​

Java Flight Recorder 是一个强大的性能分析工具,能够以极低的性能开销记录 Java 应用程序的运行时数据。通过 JFR,开发者和运维人员可以快速诊断性能问题、内存泄漏、线程争用等问题。JFR 的记录文件可以使用 JDK Mission Control 或 jfr 命令行工具进行分析,帮助用户深入了解应用程序的运行状态。