在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。