如何通过命令行启用有关垃圾收集的详细信息的日志记录?

How do I enable logging of detailed information about garbage collection through the command line?

我需要通过 Java 记录有关 GC 的信息。它是如何完成的以及要使用的命令到底是什么。

谢谢

您可以使用 -XX:+PrintGC-verbose:gc 启用它。有关完整详细信息,请参阅 https://blog.codecentric.de/en/2014/01/useful-jvm-flags-part-8-gc-logging/

http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html

所述
  • -XX:-PrintGC 在垃圾回收时打印消息。易于管理。
  • -XX:-PrintGCDetails 在垃圾回收时打印更多细节。易于管理。 (在 1.4.0 中引入。)
  • -XX:-PrintGCTimeStamps 在垃圾回收时打印时间戳。易于管理(在 1.4.0 中引入。)

有关 GC 调用的详细信息,您可以通过将这些参数传递到命令行来启用它

-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps

示例输出日志如下所示

2015-05-26T14:45:37.987-0200: 151.126: [GC (Allocation Failure) 151.126: [DefNew: 629119K->69888K(629120K), 0.0584157 secs] 1619346K->1273247K(2027264K), 0.0585007 secs] [Times: user=0.06 sys=0.00, real=0.06 secs]
2015-05-26T14:45:59.690-0200: 172.829: [GC (Allocation Failure) 172.829: [DefNew: 629120K->629120K(629120K), 0.0000372 secs]172.829: [Tenured: 1203359K->755802K(1398144K), 0.1855567 secs] 1832479K->755802K(2027264K), [Metaspace: 6741K->6741K(1056768K)], 0.1856954 secs] [Times: user=0.18 sys=0.00, real=0.18 secs]

要了解上述日志,请

  1. 2015-05-26T14:45:37.987-0200 – GC事件开始的时间。
  2. 151.126 – GC事件开始的时间,相对于JVM启动时间。以秒为单位。
  3. GC – 区分 Minor 和 Full GC 的标志。这次表明这是一个Minor GC。
  4. Allocation Failure – 收集的原因。在这种情况下,由于数据结构不适合年轻代中的任何区域而触发GC。
  5. DefNew – 使用的垃圾收集器的名称。这个神秘的名字代表用于清理年轻代的单线程标记复制停止世界垃圾收集器。
  6. 629119K->69888K – 回收前后年轻代的使用情况。
  7. (629120K) – 年轻一代的总大小。
  8. 1619346K->1273247K – 收集前后使用的总堆。
  9. (2027264K) – 总可用堆。
  10. 0.0585007 secs – GC 事件的持续时间(以秒为单位)。
  11. [Times: user=0.06 sys=0.00, real=0.06 secs] – GC 事件的持续时间,按不同类别测量:

    • 用户 – 在此收集期间垃圾收集器线程消耗的总 CPU 时间
    • sys – OS 调用或等待系统事件所花费的时间
    • real – 您的应用程序停止的时钟时间。由于 Serial Garbage Collector 始终只使用一个线程,因此实时时间等于用户时间和系统时间的总和。

要获得详细信息,您需要传递我将在下面列出的所有参数。这些选项使 Java 将垃圾收集器活动记录到指定文件中。所有记录都将加上人类可读的日期和时间。同时,您应该避免使用 -XX:+PrintGCTimeStamps,因为它会在 Java 应用程序启动的那一刻起在记录前添加无用的时间戳。阅读有关 GC 参数的更多信息 here and here.

-XX:+PrintGCDateStamps //adding DateStamps to log
-verbose:gc  //activates the a “simple” GC logging 
-XX:+PrintGCDetails //we activate the “detailed” GC logging mode

有时候知道你的申请需要多长时间是很有趣的 在垃圾回收之间运行。这可以从计算 GC 日志,但查看该信息的便捷方式是通过 接下来的两个标志产生的输出。 Read more.

-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCApplicationConcurrentTime 

启用日志轮换。这一点很重要。原因是每当应用程序重新启动时,旧的 GC 日志文件将被新的 GC 日志文件覆盖,因为文件路径相同(即 /home/GCEASY/gc.log)。 Read more about GC log rotating.

此外,GC 日志文件轮换使垃圾收集问题的分析更容易,它还保证磁盘免受 space 过度消耗。

-XX:GCLogFileSize=2M //default will be set to 512K
-XX:+UseGCLogFileRotation //must be used with -Xloggc:<filename>
-XX:NumberOfGCLogFiles=10 //must be >=1, default is one

以及要写入日志的文件:

-Xloggc:$LOG_DIR/gc.log

在一行中传递所有这些,例如:

XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=2M -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -verbose:gc -XX:+PrintGCDetails -Xloggc:$LOG_DIR/gc.log