为什么我有多个JFR录音?

时间:2019-09-08 10:23:30

标签: java jfr

在掌握Java飞行记录器(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是如何发生的?

1 个答案:

答案 0 :(得分:2)

已努力简化命令行。对于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将恢复为低开销配置。

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