likes
comments
collection
share

防痴呆记录-JFR参考 Redhat 文档, 整理 jcmd 和命令采集 JFR 数据的各种命令,防止后续老年痴呆忘记。

作者站长头像
站长
· 阅读数 41

背景

防痴呆文章

JFR:docs.oracle.com/en/java/jav…

JMC:打开 JFR 的图形化工具

工具准备

Java

Java 17 环境:sdkman.io/

强烈推荐,最好用的 Java 环境配置工具

JMC

推荐使用 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记录持续时间Time0s
filename生成记录文件名字符串-
maxAge缓冲数据的最长期限Time0s
maxsize缓冲区的最大大小(以字节为单位)Long0
dumponexitJVM 关闭时运行的转储记录布尔值-
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转储文件的最大持续时间Time0s
maxsize转储的最大字节数Long0
begin开始转储数据的时间字符串-
end转储数据的结束时间字符串-
path-to-gc-roots收集垃圾收集器 root 的路径布尔值false

dump JFR

jcmd <PID> JFR.dump name=output_file filename=output.jfr
参数描述数据类型默认值
name记录的名称字符串-
filename将记录数据复制到文件中字符串-
maxAge转储文件的最大持续时间Time0s
maxsize转储的最大字节数Long0
begin开始转储数据的时间字符串-
end转储数据的结束时间字符串-
path-to-gc-roots收集垃圾收集器 root 的路径布尔值false

配置 JFR

使用 JFR.configure 诊断命令配置 flight 记录。例如:

jcmd <PID> JFR.configure repositorypath=/home/jfr/recordings
参数描述数据类型默认值
repositorypath到仓库的路径字符串-
dumppath转储的路径字符串-
stackdepth堆栈深度Jlong64
globalbuffercount全局缓冲区数Jlong32
globalbuffersize全局缓冲区的大小Jlong524288
thread_buffer_size线程缓冲的大小Jlong8192
memorysize总内存大小Jlong16777216
maxchunksize单个磁盘块的大小Jlong12582912
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
评论
请登录