防痴呆记录-JFR参考 Redhat 文档, 整理 jcmd 和命令采集 JFR 数据的各种命令,防止后续老年痴呆忘记。
背景
防痴呆文章
JFR:docs.oracle.com/en/java/jav…
JMC:打开 JFR 的图形化工具
工具准备
Java
Java 17 环境:sdkman.io/
强烈推荐,最好用的 Java 环境配置工具
JMC
- 8.31 下载:www.oracle.com/java/techno…
- 9.* 下载:www.oracle.com/java/techno…
推荐使用 9 版本
mac 系统直接打开 JMC,会报错,原因是 JMC 的 Java 环境配置不正确,需要在 /Contents/Eclipse/jmc.ini
配置文件增加 -vm 参数指定 Java 17 环境:
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.6.600.v20231106-1826.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.2.800.v20231003-1442
--launcher.appendVmargs
-ws
cocoa
-vm
/Users/raymond/.sdkman/candidates/java/17.0.11-zulu/zulu-17.jdk/Contents/Home/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.lwawt.macosx=ALL-UNNAMED
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
jcmd 采集 JFR
检查是否支持 JFR
java -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version | grep FlightRecorder
启动 JFR
jcmd <PID> JFR.start delay=10s duration=10m filename=recording.jfr settings=profile
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
name | 记录的名称 | 字符串 | - |
设置 | 服务器端模板 | 字符串 | - |
duration | 记录持续时间 | Time | 0s |
filename | 生成记录文件名 | 字符串 | - |
maxAge | 缓冲数据的最长期限 | Time | 0s |
maxsize | 缓冲区的最大大小(以字节为单位) | Long | 0 |
dumponexit | JVM 关闭时运行的转储记录 | 布尔值 | - |
path-to-gc-roots | 收集垃圾收集器 root 的路径 | 布尔值 | False |
Settings | 记录事件的细粒度 | 字符串 | Default |
检查 JFR
jcmd <PID> JFR.check
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
name | 记录的名称 | 字符串 | - |
filename | 将记录数据复制到文件中 | 字符串 | - |
停止 JFR
jcmd <PID> JFR.stop name=output_file
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
name | 记录的名称 | 字符串 | - |
filename | 将记录数据复制到文件中 | 字符串 | - |
maxAge | 转储文件的最大持续时间 | Time | 0s |
maxsize | 转储的最大字节数 | Long | 0 |
begin | 开始转储数据的时间 | 字符串 | - |
end | 转储数据的结束时间 | 字符串 | - |
path-to-gc-roots | 收集垃圾收集器 root 的路径 | 布尔值 | false |
dump JFR
jcmd <PID> JFR.dump name=output_file filename=output.jfr
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
name | 记录的名称 | 字符串 | - |
filename | 将记录数据复制到文件中 | 字符串 | - |
maxAge | 转储文件的最大持续时间 | Time | 0s |
maxsize | 转储的最大字节数 | Long | 0 |
begin | 开始转储数据的时间 | 字符串 | - |
end | 转储数据的结束时间 | 字符串 | - |
path-to-gc-roots | 收集垃圾收集器 root 的路径 | 布尔值 | false |
配置 JFR
使用 JFR.configure
诊断命令配置 flight 记录。例如:
jcmd <PID> JFR.configure repositorypath=/home/jfr/recordings
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
repositorypath | 到仓库的路径 | 字符串 | - |
dumppath | 转储的路径 | 字符串 | - |
stackdepth | 堆栈深度 | Jlong | 64 |
globalbuffercount | 全局缓冲区数 | Jlong | 32 |
globalbuffersize | 全局缓冲区的大小 | Jlong | 524288 |
thread_buffer_size | 线程缓冲的大小 | Jlong | 8192 |
memorysize | 总内存大小 | Jlong | 16777216 |
maxchunksize | 单个磁盘块的大小 | Jlong | 12582912 |
Samplethreads | 激活线程抽样 | 布尔值 | true |
命令行采集 JFR
挺少用到的。如果应用程序启动失败,却有找不到解决思路,可以采集下启动时的 JFR
java -XX:StartFlightRecording=delay=5s,disk=false,dumponexit=true,duration=60s,filename=myrecording.jfr <<YOUR_JAVA_APPLICATION>>
delay=time
使用此参数指定 Java 应用程序启动时间和记录开始之间的延迟。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,指定 10m 表示 10 分钟。默认情况下,没有延迟,此参数被设为 0。
disk={true|false}
使用此参数指定在记录时是否将数据写入磁盘。默认情况下,此参数为 true
。
dumponexit={true|false}
使用此参数指定在 JVM 关闭时是否转储正在运行的记录。如果启用了该参数且未设置文件名,则记录将写入到启动记录进度的目录中的文件。文件名是系统生成的名称,其中包含进程 ID、记录 ID 和当前时间戳。例如,hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr。默认情况下,此参数为 false
。
duration=time
使用此参数指定记录的持续时间。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,如果您将持续时间指定为 5h,这表示 5 小时。默认情况下,此参数被设置为 0,这意味着记录持续时间中没有设置限制。
filename=path
使用此参数指定记录文件的路径和名称。记录会在停止时写入此文件。例如:
records.jfr
· /home/user/recordings/recording.jfr
name=identifier
使用此参数指定记录的名称和标识符。
maxAge=time
使用此参数指定在磁盘上应提供记录的最大天数。只有 disk 参数设置为 true 时,此参数才有效。附加 s 以指定时间(以秒为单位)、m 表示分钟、h 表示小时或 d 表示天。例如,当您指定 30s 时,它表示 30 秒。默认情况下,此参数被设置为 0,这意味着没有设置限制。
maxsize=size
使用此参数指定要为记录保留的最大磁盘数据大小。只有 disk 参数设置为 true 时,此参数才有效。该值不能小于使用 -XX:FlightRecorderOptions
设置的 maxchunksize
参数的值。附加 m 或 M 以指定大小(以 MB 为单位),或者 g 或 G 以指定大小(以 GB 为单位)。默认情况下,磁盘数据的最大大小没有限制,此参数被设置为 0。
path-to-gc-roots={true|false}
使用此参数指定在记录末尾是否收集垃圾回收(GC) root 的路径。默认情况下,此参数被设置为 false。
GC root 的路径对于查找内存泄漏非常有用。对于红帽构建的 OpenJDK 17,您可以启用 OldObjectSample
事件,该事件比使用堆转储更高效。您还可以在生产环境中使用 OldObjectSample
事件。收集内存泄漏信息会非常耗时,并会产生额外的开销。只有在您开始记录您怀疑有内存泄漏的应用程序时,才应启用此参数。如果 JFR 配置集参数设置为 profile,您可以跟踪对象泄漏的堆栈。它包含在收集的信息中。
settings=path
使用此参数指定事件设置文件的路径和名称(类型为 JFC)。默认情况下,使用 default.jfc 文件,该文件位于 JAVA_HOME/lib/jfr 中。此默认设置文件收集一组预定义的开销信息,因此对性能的影响最少,并可与持续运行的记录一起使用。第二个设置文件也会提供 profile.jfc,它提供比默认配置更多的数据,但可能会有更多的开销和影响性能。当需要更多信息时,请使用此配置短时间。
参考文档:
转载自:https://juejin.cn/post/7419313597630840847