在 Java 中滚动垃圾回收器日志

2022-09-01 00:51:29

是否可以在 Sun JVM 中滚动垃圾回收器日志?

目前我使用以下命令生成日志:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 

但是我必须使用fifo队列和旋转日志手动轮换它们,以便为每天创建一个新日志。我希望有更好的解决方案。

也许有一种方法可以从java内部访问此日志条目,以便我可以将它们重定向到log4j?

编辑:使用fifo队列的解决方案还不够好,因为如果从此队列读取的进程(例如旋转日志)读取以减慢速度,它将减慢整个jvm的速度(显然Sun / Oracle会同步进行gc日志记录)


答案 1

对GC日志轮换的内置支持已添加到HotSpot JVM中。它在 RFE 6941923中进行了描述,并在以下版本中提供:

有三个新的 JVM 标志可用于启用和配置它:

  • -XX:+UseGCLogFileRotation
    必须与-Xloggc:<filename>;
  • -XX:NumberOfGCLogFiles=<number of files>
    必须为 >=1,默认值为 1;
  • -XX:GCLogFileSize=<number>M (or K)
    默认值将设置为 512K。

答案 2

如果无法升级 Java 版本以使用新标志来轮换 gc 日志,则可以在每次应用程序启动时指定不同的 gc 文件:

JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M`

当引用 setenv 时,通常在启动或关闭时,它将引用不同的日志文件。在unix中,这可以用作“旋转”日志的方法。