2

掌握 Java Flight Recorder (JFR) 配置后,我有一个最合理的配置:

-XX:+UnlockCommercialFeatures -XX:+DebugNonSafepoints -XX:+FlightRecorder 
-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=../logs 
-XX:StartFlightRecording=compress=true,maxsize=1g

然而,使用JFR.check表明我没有一个,而是两个正在进行的录音。

Recording: recording=0 name="HotSpot default" (running)

Recording: recording=1 name="Recording 1" maxsize=1.0GB (running)

录音0是怎么发生的?

4

1 回答 1

5

一直在努力简化命令行。对于 JDK 11 及更高版本,这是我推荐的。

$ java -XX:StartFlightRecording:maxsize=1g,filename=../logs

我提到这一点是为了减少阅读这篇文章的人使用更新的 JDK 时的困惑。

你得到两个录音的原因是

-XX:FlightRecorderOption=defaultrecording=true 

开始录音。

更复杂的是,如果要在指定目录(即 ../logs)的位置创建记录,以便为每个 JVM 进程生成唯一的文件名,则需要使用

-XX:FlightRecordingOption=dumponexitpath=<directory> 

这在 JDK 7/8 上仅适用于以defaultrecording=true开始的录制。我认为如果您更改为-XX:StartFlightRecording可以删除:

-XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,
    disk=true,maxsize=1g,dumponexitpath=../logs

然而,录音不会被压缩。

也就是说,上述内容不适用于 JDK 11 或更高版本,因为defaultrecording=true选项已被删除。相反,该功能已移至-XX:StartFlightRecording:filename=选项,其中默认启用压缩和磁盘,如果您设置文件名,则dumponexit=true是多余的。

在 JVM 内部,只有一个记录在运行,所以不必担心多个记录的开销。可以启动多个记录的原因是允许堆叠配置。例如,您可能希望一直运行一个低开销的记录,然后开始一个更具侵入性的记录十分钟。当十分钟结束时,JVM 将恢复到低开销配置。

还有更多,我可以写一篇关于这个的文章,但让我们停在这里。

于 2019-09-08T16:02:18.017 回答