掌握 Java Flight recorder (JFR) 配置,我有一个最合理的配置:
-XX:+UnlockCommercialFeatures -XX:+DebugNonSafepoints -XX:+FlightRecorder
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=../logs
-XX:StartFlightRecording=compress=true,maxsize=1g
Run Code Online (Sandbox Code Playgroud)
JFR.check然而,使用表明我没有一个,而是两个正在进行的录音。
Recording: recording=0 name="HotSpot default" (running)
Recording: recording=1 name="Recording 1" maxsize=1.0GB (running)
Run Code Online (Sandbox Code Playgroud)
录音0是怎么发生的?
一直在努力简化命令行。对于 JDK 11 及更高版本,这是我推荐的。
$ java -XX:StartFlightRecording:maxsize=1g,filename=../logs
Run Code Online (Sandbox Code Playgroud)
如果阅读本文的人使用更新的 JDK,我提到这一点是为了减少混淆。
你得到两个录音的原因是
-XX:FlightRecorderOption=defaultrecording=true
Run Code Online (Sandbox Code Playgroud)
开始录音。
更复杂的是,如果要在指定目录(即 ../logs)的位置创建记录以生成每个 JVM 进程的唯一文件名,则需要使用
-XX:FlightRecordingOption=dumponexitpath=<directory>
Run Code Online (Sandbox Code Playgroud)
它在 JDK 7/8 上仅适用于以defaultrecording=true开头的记录。我认为-XX:StartFlightRecording如果您更改为:
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,
disk=true,maxsize=1g,dumponexitpath=../logs
Run Code Online (Sandbox Code Playgroud)
然而,录音不会被压缩。
也就是说,上述内容不适用于 JDK 11 或更高版本,因为defaultrecording=true选项已被删除。相反,该功能已移至-XX:StartFlightRecording:filename=选项,其中默认启用压缩和磁盘,如果设置文件名,则dumponexit=true是多余的。
在 JVM 内部只有一个记录在运行,所以不用担心多个记录的开销。可以启动多个记录的原因是允许堆叠配置。例如,您可能希望一直运行低开销记录,然后开始 10 分钟更具侵入性的记录。当十分钟结束时,JVM 将恢复到低开销配置。
还有更多,我可以写一篇关于这个的文章,但让我们到此为止。