jfr

Java Flight Recorder(JFR)是一种用于收集有关正在运行的Java应用程序的诊断和分析数据的工具。

它集成到 Java 虚拟机 (JVM) 中,几乎不会造成性能开销,因此即使在负载较重的生产环境中也可以使用。

注意

JDK8的8u262版本之后才支持JFR

命令选项 描述
-d, --delay <nanotime> 延迟记录时长(d, h, m, s),不带单位就是秒,默认0, 如5s
--dumponexit <boolean> dump记录在jvm退出的时候,默认false
--duration <nanotime> JFR记录持续时间(d, h, m, s), 不带单位就是秒, 默认一直记录
-f, --filename <file> 记录结果文件路径
--maxage <nanotime> 最大记录时长保留记录文件(d, h, m, s),默认无限制
--maxsize <number> 最大记录文件大小限制,可为G(B)、M(B)、k(B),0表示无限制
-n, --name <name> 记录名称
-r, --recording <record-number> 记录编号,默认为-1
-s, --settings <value> JFR配置文件,位于$JAVA_HOME/lib/jfr/*.jfc,默认default,可选值profile
--state <state> 通过状态查询记录,可选值newdelayrunningstoppedclosed
-h, --help 帮助
<cmd> 命令名称,startstatusstopdump

示例

# 启动记录
[arthas@17088]$ jfr start
Started recording 1. No limit specified, using maxsize=250MB as default.
# 查看记录状态
[arthas@17088]$ jfr status
Recording: recording=1 name=Recording-1 (running)
# 停止记录
[arthas@17088]$ jfr -r 1 stop
Stop recording 1, The result will be written to:
C:\Users\A\.arthas\lib\3.6.7\arthas\arthas-output\20230404-165306.jfr

# dump运行中的记录
# 启动记录
[arthas@17088]$ jfr start
Recording: recording=3 name=Recording-3 (running)
# dump不指定目录
[arthas@17088]$ jfr dump -r 3
Dump recording 3, The result will be written to:
C:\Users\A\.arthas\lib\3.6.7\arthas\arthas-output\20230404-174033.jfr
# dump指定目录
[arthas@18604]$ jfr dump -r 3 -f /tmp/test.jfr
Dump recording 3, The result will be written to:
/tmp/test.jfr

遇到的问题

  • 在某些JDK版本可能会提示Jfr is a commercial feature and will need to be unlocked before use

    JAVA启动参数-XX:+UnlockCommercialFeatures启动即可

  • jfr文件打开方式

    使用$JAVA_HOME/bin/jmc.exe(Java Mission Control)打开查看

  • 若JDK为带有jmc.exe文件

    Oracle官网 下载

  • Oracle Java Mission Control启动提示java.lang.IllegalStateException: 无法获取应用程序服务。请确保解析并启动了 org.eclipse.core.runtime 束(请参阅 config.ini)

    由于jmc和本地JDK版本不兼容导致

      -startup
      plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
      --launcher.library
      plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.500.v20220509-0833
      --launcher.appendVmargs
      # 新增JDK配置
      -vm
      D:\tools\jdk-11.0.13\bin
      -vmargs
      -XX:+IgnoreUnrecognizedVMOptions
      -XX:+UnlockDiagnosticVMOptions
      -XX:+DebugNonSafepoints
      -XX:FlightRecorderOptions=stackdepth=128
      -XX:+FlightRecorder
      -XX:StartFlightRecording=name=JMC_Default,maxsize=100m
      -Djava.net.preferIPv4Stack=true
      -Djdk.attach.allowAttachSelf=true
      --add-exports=java.xml/com.sun.org.apache.xerces.internal.parsers=ALL-UNNAMED
      --add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED
      --add-exports=java.management/sun.management=ALL-UNNAMED
      --add-exports=java.management/sun.management.counter.perf=ALL-UNNAMED
      --add-exports=jdk.management.agent/jdk.internal.agent=ALL-UNNAMED
      --add-exports=jdk.attach/sun.tools.attach=ALL-UNNAMED
      --add-opens=java.base/java.net=ALL-UNNAMED
      --add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED
      -Dsun.java.command=JMC
      --add-exports=java.desktop/sun.awt.windows=ALL-UNNAMED