Garbage Collection Logging to a File in Java – 在Java中把垃圾收集记录到一个文件中

最后修改: 2020年 7月 18日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

Garbage collection is a marvel of the Java programming language providing us with automatic memory management. Garbage collection hides the details of having to manually allocate and deallocate memory. While this mechanism is fantastic, sometimes it doesn’t work the way we want. In this tutorial, we’ll explore Java’s logging options for garbage collection statistics and discover how to redirect these statistics to a file.

垃圾收集是Java编程语言的一个奇迹,它为我们提供了自动内存管理。垃圾收集隐藏了必须手动分配和删除内存的细节。虽然这种机制很奇妙,但有时它并不按我们想要的方式工作。在本教程中,我们将探讨Java的垃圾收集统计数据的记录选项,并发现如何将这些统计数据重定向到一个文件

2. GC Logging Flags in Java 8 and Earlier

2.Java 8及以前的GC日志标志

First, let’s explore the JVM flags relating to GC logging in Java versions prior to Java 9.

首先,让我们探讨一下Java 9之前的Java版本中与GC记录有关的JVM标志。

2.1. -XX:+PrintGC

2.1.-XX:+PrintGC

The -XX:+PrintGC flag is an alias for -verbose:gc and turns on basic GC logging. In this mode, a single line is printed for every young-generation and every full-generation collection. Let’s now turn our attention to providing detailed GC information.

-XX:+PrintGC标志是-verbose:gc的别名,开启了基本的GC日志记录。在这种模式下,每一个年轻一代和每一个完整一代的集合都会打印一行。现在让我们把注意力转向提供详细的GC信息。

2.2. -XX:+PrintGCDetails

2.2.-XX:+PrintGCDetails

Similarly, we have the flag -XX:+PrintGCDetails used to activate detailed GC logging instead of -XX:+PrintGC.

同样地,我们的标志-XX:+PrintGCDetails用于激活详细的GC日志记录,而不是-XX:+PrintGC

Note that the output from -XX:+PrintGCDetails changes depending on the GC algorithm in use.

请注意,-XX:+PrintGCDetails的输出会根据使用的GC算法而改变。

Next, we’ll look at annotating our logs with date and time information.

接下来,我们将看看如何用日期和时间信息来注释我们的日志。

2.3. -XX:+PrintGCDateStamps and -XX:+PrintGCTimeStamps

2.3.-XX:+PrintGCDateStamps-XX:+PrintGCTimeStamps

We can add dates and timing information to our GC logs by utilizing the flags -XX:+PrintGCDateStamps and -XX:+PrintGCTimeStamps, respectively.

我们可以通过利用标志-XX:+PrintGCDateStamps-XX:+PrintGCTimeStamps,分别在GC日志中添加日期和时间信息。

First, -XX:+PrintGCDateStamps adds the date and time of the log entry to the beginning of each line.

首先,-XX:+PrintGCDateStamps将日志条目的日期和时间添加到每一行的开头。

Second, -XX:PrintGCTimeStamps adds a timestamp to every line of the log detailing the time passed (in seconds) since the JVM was started.

其次,-XX:PrintGCTimeStamps为日志的每一行添加一个时间戳,详细说明自JVM启动以来所经过的时间(以秒计)。

2.4. -Xloggc

2.4.-Xloggc

Finally, we come to redirecting the GC log to a file. This flag takes an optional filename as an argument using the syntax -Xloggc:file and without the presence of a file name the GC log is written to standard out.

最后,我们来看看将GC日志重定向到一个文件。这个标志使用-Xloggc:file的语法将一个可选的文件名作为参数,如果没有文件名,GC日志将被写到标准输出。

Additionally, this flag also sets the -XX:PrintGC and -XX:PrintGCTimestamps flags for us. Let’s look at some examples:

此外,这个标志还为我们设置了-XX:PrintGC-XX:PrintGCTimestamps标志。让我们看看一些例子。

If we want to write the GC log to standard output, we can run:

如果我们想把GC日志写到标准输出,我们可以运行。

java -cp $CLASSPATH -Xloggc mypackage.MainClass

Or to write the GC log to a file, we would run:

或者把GC日志写到一个文件中,我们会运行。

java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass

java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass

3. GC Logging Flags in Java 9 and Later

3.Java 9及以后版本中的GC日志标志

In Java 9+, -XX:PrintGC, the alias for -verbose:gc, has been deprecated in favor of the unified logging option, -Xlog. All other GC flags mentioned above are still valid in Java 9+. This new logging option allows us to specify which messages should be shown, set the log level, and redirect the output.

在Java 9+中,-XX:PrintGC,即-verbose:gc的别名,已被弃用,而采用统一的日志选项,-Xlog。上面提到的所有其他GC标志在Java 9+中仍然有效。这个新的日志选项允许我们指定哪些信息应该被显示,设置日志级别,以及重定向输出

We can run the below command to see all the available options for log levels, log decorators, and tag sets:

我们可以运行下面的命令来查看日志级别、日志装饰器和标签集的所有可用选项。

java -Xlog:logging=debug -version

For example, if we wanted to log all GC messages to a file, we would run:

例如,如果我们想把所有的GC信息记录到一个文件中,我们将运行。

java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

Additionally, this new unified logging flag is repeatable, so you can, for example, log all GC messages to both standard out and a file:

此外,这个新的统一日志标志是可重复的,所以你可以,例如,将所有GC消息同时记录到标准输出和一个文件中

java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass

4. Conclusion

4.总结

In this article, we’ve shown how to log garbage collection output in both Java 8 and Java 9+ including how to redirect that output to a file.

在这篇文章中,我们展示了如何在Java 8和Java 9+中记录垃圾收集的输出,包括如何将该输出重定向到一个文件。