ChatGPT解决这个技术问题 Extra ChatGPT

如何将详细的垃圾收集输出重定向到文件?

如何将详细垃圾收集输出重定向到文件? Sun 的网站显示了一个适用于 Unix 的示例,但它不适用于 Windows。


C
Community

java -X 的输出:

-Xloggc:<file>    log GC status to a file with time stamps

记录在案的 here

-Xloggc:filename 设置详细 GC 事件信息应重定向到的文件以进行日志记录。写入此文件的信息类似于 -verbose:gc 的输出,其中包含自每个记录事件之前的第一个 GC 事件以来经过的时间。 -Xloggc 选项覆盖 -verbose:gc 如果两者都使用相同的 java 命令给出。示例:-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 似乎不起作用。
此外,正如我所料,这不会增加输出。使用这些参数后没有其他详细信息: -Xloggc:gc.log -XX:-PrintGCDetails
“-XX:+PrintGCDetails”似乎适用于-Xloggc。我不知道为什么 Sun 页面有 - 而不是 +。
那行得通。谢谢!现在,我使用这些选项: set JAVA_OPTS=%JAVA_OPTS% -Xloggc:logs\gc.log -XX:+PrintGCDetails -XX:MaxPermSize=128m
M
Marc Giombetti

如果您还想将输出通过管道传输到单独的文件,您可以执行以下操作:

在 Sun JVM 上:

-Xloggc:C:\whereever\jvm.log -verbose:gc -XX:+PrintGCDateStamps

在 IBM JVM 上:

-Xverbosegclog:C:\whereever\jvm.log 

如果使用 -Xloggc,则不需要 -verbose:gc。
A
Ali Dehghani

Java 9 和统一 JVM 日志记录

JEP 158 为 JVM 的所有组件引入了一个通用的日志记录系统,这将改变(并且 IMO 简化)日志记录与 GC 的工作方式。 JEP 158 添加了一个新的命令行选项来控制来自 JVM 的所有组件的日志记录:

-Xlog

例如,以下选项:

-Xlog:gc

将使用 info 级别将带有 gc 标记的消息记录到 stdout。或者这个:

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

将使用 debug 级别标记有 gc 标记的消息记录到一个名为 gc.txt 的文件中,没有任何修饰。如需更详细的讨论,您可以查看 JEP 页面中的示例。


在 JDK 16 中,如果您使用旧的 -Xloggc 而不是 -Xlog:gc:...,您甚至会收到警告
如何将日志附加到现有文件?
1
18446744073709551615

要添加到上述答案,有一篇很好的文章:Patrick Peschlow 的Useful JVM Flags – Part 8 (GC Logging)

一个简短的摘录:

-XX:+PrintGC 标志(或别名 -verbose:gc)激活“简单”GC 日志记录模式

默认情况下,GC 日志被写入标准输出。使用 -Xloggc:<file>,我们可以改为指定一个输出文件。请注意,此标志也隐式设置 -XX:+PrintGC-XX:+PrintGCTimeStamps

如果我们使用 -XX:+PrintGCDetails 而不是 -XX:+PrintGC,我们将激活“详细”GC 日志记录模式,该模式因所使用的 GC 算法而异。

-XX:+PrintGCTimeStamps 将反映自 JVM 启动以来经过的实时时间(以秒为单位)的时间戳添加到每一行。

如果我们指定 -XX:+PrintGCDateStamps,每一行都以绝对日期和时间开头。