如何将冗长的垃圾回收输出重定向到文件?

73

我该如何将详细的垃圾回收输出重定向到文件?Sun公司的网站给出了Unix的示例,但在Windows上无法使用。

4个回答

96

根据 java -X 命令输出结果:

    -Xloggc:<file>    将GC状态记录到带有时间戳的文件中

具体说明文档在此:

-Xloggc:filename

设置详细GC事件信息应被重定向到的日志文件。写入该文件的信息类似于使用-verbose:gc选项输出的信息,但还包括从每个记录的事件之前首个GC事件以来的经过时间。如果在同一java命令中同时给出了-Xloggc-verbose:gc选项,则-Xloggc选项将覆盖-verbose:gc

例如:

    -Xloggc:garbage-collection.log

因此输出内容类似于如下形式:

0.590: [GC 896K->278K(5056K), 0.0096650 secs]
0.906: [GC 1174K->774K(5056K), 0.0106856 secs]
1.320: [GC 1670K->1009K(5056K), 0.0101132 secs]
1.459: [GC 1902K->1055K(5056K), 0.0030196 secs]
1.600: [GC 1951K->1161K(5056K), 0.0032375 secs]
1.686: [GC 1805K->1238K(5056K), 0.0034732 secs]
1.690: [Full GC 1238K->1238K(5056K), 0.0631661 secs]
1.874: [GC 62133K->61257K(65060K), 0.0014464 secs]

java --Xloggc:firstgen.log -Xloggc:secondgen.log 似乎不起作用。 - djangofan
同样的,这并没有像我预期的那样增加输出。在使用了这些参数之后没有额外的细节:-Xloggc:gc.log -XX:-PrintGCDetails - djangofan
7
"-XX:+PrintGCDetails" 似乎与 -Xloggc 一起工作。我不知道为什么 Sun 的页面上使用 "-" 而不是 "+"。 - Michael Myers
那个有效。谢谢!现在,我使用这些选项: set JAVA_OPTS=%JAVA_OPTS% -Xloggc:logs\gc.log -XX:+PrintGCDetails -XX:MaxPermSize=128m - djangofan

38
如果您还想将输出导入到单独的文件中,可以这样做:
在Sun JVM上:
-Xloggc:C:\whereever\jvm.log -verbose:gc -XX:+PrintGCDateStamps

在 IBM JVM 上:

-Xverbosegclog:C:\whereever\jvm.log 

6
如果您使用 -Xloggc,则不需要 -verbose:gc。 - Mirko Ebert

15

Java 9 & 统一JVM记录日志

JEP 158引入了一个通用的日志系统,适用于JVM所有组件,将改变(并简化)GC日志记录方式。 JEP 158新增了一种命令行选项,以控制来自JVM所有组件的日志记录:

-Xlog
例如,以下选项:
-Xlog:gc

将标记为gc的日志消息,使用info级别记录到stdout中。或者这个:

-Xlog:gc=debug:file=gc.txt:none

将带有gc标记的日志消息使用debug级别记录到名为gc.txt的文件中,不带装饰。如需更详细的讨论,请查看JEP页面中的示例。


2
使用JDK 16,如果您使用旧的“-Xloggc”,而不是“-Xlog:gc:...”,甚至会收到警告。 - martin-g
我该如何将日志追加到现有文件中? - Diego Marin Santos

8
除了以上答案,这里有一篇很好的文章:Patrick Peschlow撰写的“有用的JVM标志-第8部分(GC日志记录)”
简要摘录如下:
标志-XX:+PrintGC(或别名 -verbose:gc )激活“简单”的GC日志记录模式。
默认情况下,GC日志将写入stdout。使用-Xloggc:<file>代替,我们可以指定一个输出文件。请注意,此标志还会隐式设置-XX:+PrintGC-XX:+PrintGCTimeStamps
如果我们使用-XX:+PrintGCDetails而不是-XX:+PrintGC,则会激活“详细”GC日志记录模式,具体取决于所使用的GC算法。
使用-XX:+PrintGCTimeStamps,在每行中添加反映自JVM启动以来经过的实际时间的时间戳(以秒为单位)。
如果我们指定-XX:+PrintGCDateStamps,则每行都以绝对日期和时间开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接