滚动垃圾收集器登录java

Krz*_*soń 42 java logging garbage-collection

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

目前我用以下方法生成日志

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 
Run Code Online (Sandbox Code Playgroud)

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

也许有一种方法可以从java里面访问这些日志条目,所以我可以将它们重定向到log4j?

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

Joh*_*ing 84

HotSpot JVM中添加了对GC日志轮换的内置支持.它在RFE 6941923中有描述,可在以下位置获得:

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

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

  • -XX:NumberOfGClogFiles应该有一个大写字母L(-XX:NumberOfGCLogFiles) (5认同)
  • 遗憾的是,这不是每天,我没有看到大小滚动的点,我通常想看到给定日期的日志,而不是123MB :) (2认同)
  • 大小滚动的点是日志文件的总大小受到限制(到NumberOfGCLogFiles*GCLogFileSize),这避免了无空间设备上的错误,并且超过了查找给定日期的日志的不便. (2认同)

Und*_*rse 6

如果无法升级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`
Run Code Online (Sandbox Code Playgroud)

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

  • @Pathduck这个答案适用于较旧的Java版本.这意味着您无法附加到Xlogcc.我的实验还表明,您无法使运行的java关闭并重新打开日志.你也不能使它寻求(EOF),java会记住Xloggc里面的文件位置.主要PITA. (2认同)