在掌握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是如何发生的?
答案 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将恢复为低开销配置。
还有更多,我可以写一篇关于这方面的文章,但让我们在这里停止。