Java Flight Recorder - 连续滚动记录

Java Flight Recorder - Continuous rolling recording

问题

如何将滚动记录到磁盘,最大年龄

上下文

当我的服务器出现问题时,我希望能够转储前几小时的分析信息并对其进行分析,以了解出了什么问题。

  1. 因为我不知道什么时候会变坏,JDK 应该会不断将事件保存到磁盘。
  2. 由于服务器不经常重启,为了避免文件无限增长,我需要设置某种上限(年龄或大小)。

所以,换句话说,我希望 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>

注意额外的参数 dumponexitdumponexitpath,在我原来的问题中没有出现。我最终也需要那些。
经过反复试验,似乎 dumponexit 必须存在于 XX:StartFlightRecording 参数中,并且 dumponexitpath 必须存在于 FlightRecorderOptions 参数中。似乎没有其他安排有效。

另请注意,删除 -XX:+FlightRecorderdefaultrecording=true(如 Kire 所建议的)仍然 有效。话虽如此,我认为 defaultrecording=true 的存在不会触发双重录音。
我这样说是因为在发出命令 jcmd <PID> JFR.check <name> 时我只有一个条目。