繁体   English   中英

Java飞行记录仪-连续滚动记录

[英]Java Flight Recorder - Continuous rolling recording

问题

如何以最大年龄滚动记录放入磁盘?

语境

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

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

因此,换句话说,我希望 JDK 将记录连续保存到磁盘,但删除较旧的文件/记录,以使总量保持在某个阈值(年龄或大小)以下。

为此,这些是我为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 小时的记录保留在磁盘上。 但不,它已经过去 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 开始,不再需要它。

JDK 8u40 或更高版本的-XX:StartFlightRecoding不需要-XX:+FlightRecorder JFR 缓冲区现在在第一次录制开始时设置,而不是在 JVM 开始时设置。 如果使用defaultrecording=true开始录制,则仍然需要-XX:+FlightRecorder

-XX:FlightRecorderOptions=defaultrecording=true做了很多事情,主要是出于历史原因,但仅在进行内存记录时才需要。 从 JDK 9 开始,该选项不再需要并且已被删除。

-XX:FlightRecorderOptions=disk=true,maxage=1h如果使用-XX:StartFlightRecording则不需要,这是启动 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>我只有一个条目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM