Java Flight Recorder - 连续滚动记录
Java Flight Recorder - Continuous rolling recording
问题
如何将滚动记录到磁盘,最大年龄?
上下文
当我的服务器出现问题时,我希望能够转储前几小时的分析信息并对其进行分析,以了解出了什么问题。
- 因为我不知道什么时候会变坏,JDK 应该会不断将事件保存到磁盘。
- 由于服务器不经常重启,为了避免文件无限增长,我需要设置某种上限(年龄或大小)。
所以,换句话说,我希望 JDK 将录音连续保存到磁盘,但删除较旧的 files/recordings,以便总量保持在某个阈值(年龄或大小)以下).
为此,这些是我对版本 Oracle JDK 1.8.0_144
:
的选择
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording
name=<foo-bar>
-XX:FlightRecorderOptions
defaultrecording=true // what does this do even?
disk=true
maxage=1h // this is what I thought would solve my problem!
repository=<path-to-where-I-want-the-recording>
maxchunksize=5M
我本以为设置maxage=1h
只会在磁盘上保留最后一小时的录音。但不是! 1天过去了,文件还没封顶
同时 maxchunksize
似乎起作用了。各种.jfr
个文件大约有5M。其中有很多这样的文件,因为没有强制执行年龄上限。
我做错了什么?
我认为问题在于您正在开始两份录音,一份是 -XX:StartFlightRecording
,一份是 -XX:FlightRecorderOptions=defaultrecording=true
。
带-XX:StartFlightRecording
的为无界。我认为以下选项适用于 Oracle JDK 1.8.0_144 和您的用例:
-XX:+UnlockCommercialFeatures
-XX:FlightRecorderOptions=repository=<path>
-XX:StartFlightRecording=maxage=1h,name=<name>
-XX:+UnlockCommercialFeatures
是必需的,因为 JFR 是 Oracle 中的商业特性 JDK 8。从 JDK 11 开始,不再需要它。
-XX:+FlightRecorder
不需要 JDK 8u40 或更高版本。 JFR 缓冲区现在在第一次记录开始时设置,而不是在 JVM 启动时设置。
-XX:FlightRecorderOptions=defaultrecording=true
做了很多事情,主要是出于历史原因,但只有在做 in-memory 录音时才需要。从 JDK 9 开始,该选项不再需要,已被删除。
如果使用 -XX:StartFlightRecording
,则不需要 -XX:FlightRecorderOptions=disk=true,maxage=1h
,这是启动 JFR 的推荐方式。
除非您遇到问题,否则我会将 maxchunksize
保留为默认值 (12 MB)。这是 JFR 优化和测试的块文件大小。
我接受Kire Haglin
的回答。
在这方面对我有用的东西增加一点价值 JDK:
-XX:+UnlockCommercialFeatures
-XX:StartFlightRecording
name=<foo-bar>
maxage=12h
dumponexit=true
-XX:FlightRecorderOptions
dumponexitpath=<path-to-file>.jfr
disk=true
repository=<some-folder-path>
注意额外的参数 dumponexit
和 dumponexitpath
,在我原来的问题中没有出现。我最终也需要那些。
经过反复试验,似乎 dumponexit
必须存在于 XX:StartFlightRecording
参数中,并且 dumponexitpath
必须存在于 FlightRecorderOptions
参数中。似乎没有其他安排有效。
另请注意,删除 -XX:+FlightRecorder
和 defaultrecording=true
(如 Kire 所建议的)仍然 有效。话虽如此,我认为 defaultrecording=true
的存在不会触发双重录音。
我这样说是因为在发出命令 jcmd <PID> JFR.check <name>
时我只有一个条目。
问题
如何将滚动记录到磁盘,最大年龄?
上下文
当我的服务器出现问题时,我希望能够转储前几小时的分析信息并对其进行分析,以了解出了什么问题。
- 因为我不知道什么时候会变坏,JDK 应该会不断将事件保存到磁盘。
- 由于服务器不经常重启,为了避免文件无限增长,我需要设置某种上限(年龄或大小)。
所以,换句话说,我希望 JDK 将录音连续保存到磁盘,但删除较旧的 files/recordings,以便总量保持在某个阈值(年龄或大小)以下).
为此,这些是我对版本 Oracle JDK 1.8.0_144
:
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:StartFlightRecording
name=<foo-bar>
-XX:FlightRecorderOptions
defaultrecording=true // what does this do even?
disk=true
maxage=1h // this is what I thought would solve my problem!
repository=<path-to-where-I-want-the-recording>
maxchunksize=5M
我本以为设置maxage=1h
只会在磁盘上保留最后一小时的录音。但不是! 1天过去了,文件还没封顶
同时 maxchunksize
似乎起作用了。各种.jfr
个文件大约有5M。其中有很多这样的文件,因为没有强制执行年龄上限。
我做错了什么?
我认为问题在于您正在开始两份录音,一份是 -XX:StartFlightRecording
,一份是 -XX:FlightRecorderOptions=defaultrecording=true
。
带-XX:StartFlightRecording
的为无界。我认为以下选项适用于 Oracle JDK 1.8.0_144 和您的用例:
-XX:+UnlockCommercialFeatures
-XX:FlightRecorderOptions=repository=<path>
-XX:StartFlightRecording=maxage=1h,name=<name>
-XX:+UnlockCommercialFeatures
是必需的,因为 JFR 是 Oracle 中的商业特性 JDK 8。从 JDK 11 开始,不再需要它。
-XX:+FlightRecorder
不需要 JDK 8u40 或更高版本。 JFR 缓冲区现在在第一次记录开始时设置,而不是在 JVM 启动时设置。
-XX:FlightRecorderOptions=defaultrecording=true
做了很多事情,主要是出于历史原因,但只有在做 in-memory 录音时才需要。从 JDK 9 开始,该选项不再需要,已被删除。
-XX:StartFlightRecording
,则不需要 -XX:FlightRecorderOptions=disk=true,maxage=1h
,这是启动 JFR 的推荐方式。
除非您遇到问题,否则我会将 maxchunksize
保留为默认值 (12 MB)。这是 JFR 优化和测试的块文件大小。
我接受Kire Haglin
的回答。
在这方面对我有用的东西增加一点价值 JDK:
-XX:+UnlockCommercialFeatures
-XX:StartFlightRecording
name=<foo-bar>
maxage=12h
dumponexit=true
-XX:FlightRecorderOptions
dumponexitpath=<path-to-file>.jfr
disk=true
repository=<some-folder-path>
注意额外的参数 dumponexit
和 dumponexitpath
,在我原来的问题中没有出现。我最终也需要那些。
经过反复试验,似乎 dumponexit
必须存在于 XX:StartFlightRecording
参数中,并且 dumponexitpath
必须存在于 FlightRecorderOptions
参数中。似乎没有其他安排有效。
另请注意,删除 -XX:+FlightRecorder
和 defaultrecording=true
(如 Kire 所建议的)仍然 有效。话虽如此,我认为 defaultrecording=true
的存在不会触发双重录音。
我这样说是因为在发出命令 jcmd <PID> JFR.check <name>
时我只有一个条目。