Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志。而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数。今天就让我们来学习一下 Java 虚拟机中所有与 GC 日志有关的参数。相信掌握了这些参数之后,对于大家线上打印 GC 日志是有不少帮助的。
为了能够更直观地显示出每个参数的作用,我们将以下面的 Test 为例子去设置 GC 日志参数。
public class TestGC {
public static void main(String[] args) {
// allocate 8M space
byte[] b = new byte[1024 * 1024 * 8];
System.out.println("first allocate");
// allocate 8M space
b = new byte[1024 * 1024 * 8];
System.out.println("second allocate");
}
}
在上面的程序中,我们两次分配了8M 的内存空间。为了认为制造 GC,我们启动时的 JVM 参数固定加上下面几个参数:
-XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8
- -XX:+UseSerialGC 表示强制使用Serial+SerialOld收集器组合
- -Xms20m 表示堆空间初始大小为 20 M。
- -Xmx20m 表示堆空间最大大小为 20 M。
- -Xmn10m 表示新生代大小为 10M。
- -XX:SurvivorRatio=8 表示Eden:Survivor=8:1
经过上面这个设置,此时我们的堆空间的内存比例情况如下:Eden区 8M,FromSurvivor 1M,ToSurvivor 1M,老年代 10M。
下面就让我们来看看油管 GC 的参数有哪些吧。
打印GC日志
在 GC 日志参数中,最简单的一个参数就是打印 GC 日志:-XX:PrintGC。我们用下面的命令运行程序:
java -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:+PrintGC com.chenshuyi.GCDemo
输出结果:
first allocate
second allocate
[GC (Allocation Failure) 4767K->4374K(19456K), 0.0045179 secs]
可以看到程序在第一次分配数组空间的时候发生了 GC,并且把 GC 前后以及堆空间大小都打印了出来。该日志显示 GC 前堆空间使用量为 4767K(4M左右)。GC 后堆空间为 4374K,当前可用堆大小为 19456K。
但你会发现使用 PrintGC 参数打印出来的日志比较简单,无法查看更详细的信息。如果你要查看更详细的信息,那么就需要下面这个参数。
打印详细GC日志
如果要查看更加详细的 GC 日志,那么就要使用 -XX:+PrintGCDetails 参数。下面我们使用该参数运行程序:
java -XX:+UseSerialGC -Xms20M -Xmx20