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> | 通过状态查询记录,可选值**new、delay、running、stopped、closed** |
| -h, --help | 帮助 |
| <cmd> | 命令名称,start、status、stop、dump |
示例
bash
# 启动记录
[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.jfr1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
遇到的问题
在某些JDK版本可能会提示
Jfr is a commercial feature and will need to be unlocked before useJAVA启动参数
-XX:+UnlockCommercialFeatures启动即可jfr文件打开方式
使用
$JAVA_HOME/bin/jmc.exe(Java Mission Control)打开查看若JDK为带有jmc.exe文件
Oracle Java Mission Control启动提示
java.lang.IllegalStateException: 无法获取应用程序服务。请确保解析并启动了 org.eclipse.core.runtime 束(请参阅 config.ini)ini-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-UNNAMED1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


