在java中滚动垃圾收集器日志

是否有可能在Sun JVM中滚动垃圾收集器日志?

目前我使用以下产生日志:

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

但是我必须使用fifo队列和rotatelogs手动轮换它们来为每一天创build一个新的日志。 我希望有更好的解决办法。

也许有办法从Java内部访问这个日志条目,所以我可以redirect到log4j?

编辑:与FIFO队列的解决scheme是不够好的,因为如果从这个队列(例如rotatelogs)读取的进程慢,它会减慢整个jvm(显然Sun / Oracle做gc日志logging同步)

内置的GC日志旋转支持已被添加到HotSpot JVM中。 它在RFE 6941923中进行了描述,可在以下位置获得:

  • Java 6更新34
  • Java 7 Update 2 (但在这些发行说明中没有提及它)

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

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

如果你不能升级你的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被引用时,通常在启动或closures时,它会引用另一个日志文件。 在unix中,这可以用作“旋转”日志的方法。

你尝试过这个新的select吗?

我试过jdk7u7,jdk7u6和jdk6u35是这样的:

 java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M 

但每个版本我都看到这个错误:

 Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 

对于7u2的漏洞修复程序#6941923在此处引用: http : //www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

一个有趣的方法是将gc.logredirect到命名pipe道-Xloggc:/my/named/pipe 如何将GC日志写入命名pipe道

然后从应用程序本身读取该pipe道: 如何从Java打开Windows命名pipe道?

并从代码中logging到任意(例如asynchronous滚动)logbacklogging器。

试过在Windows机器上。 不幸的是,在Windows上安装比在Linux上更麻烦。

在Windows上,它基本上在另外的Powershell脚本的帮助下工作(也可以是专用的应用程序)。 此示例项目还包含一个演示应用程序,可以立即使用它来testingGC日志redirect到Logback通过SLF4J。