查看java虚拟机默认的垃圾收集器

今天看周志明老师的《深入理解java虚拟机》第三版,看到垃圾回收器这一章,想查看不做任何设置的情况下JVM默认的老年代和新生代的收集器分别是啥,这里还是挺绕的。

测试环境

Linux 5.10 + java8

虚拟机中垃圾回收器的组合

在这里插入图片描述

查看默认收集器
$ java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=252872576 -XX:MaxHeapSize=4045961216 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)

如上命令查看,打印了-XX:+UseParallelGC,但是光看这个根本不知道是哪个Parallel收集器,《深入理解java虚拟机》有如下描述,但是光打印-XX:+UseParallelGC其实并不能说明使用的是Parallel Scavenge + serial Old。
在这里插入图片描述
为什么不能说明?
执行java -XX:+PrintGCDetails -version,可以看到输出的有PSYoungGen,ParOldGen ,可以看到有个ParOld,那到底老年代 用的是 serial Old还是Parallel Old???

$ java -XX:+PrintGCDetails -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)
Heap
PSYoungGen      total 72192K, used 2478K [0x000000076f980000, 0x0000000774a00000, 0x00000007c0000000)
eden space 61952K, 4% used [0x000000076f980000,0x000000076fbeb9d8,0x0000000773600000)
from space 10240K, 0% used [0x0000000774000000,0x0000000774000000,0x0000000774a00000)
to   space 10240K, 0% used [0x0000000773600000,0x0000000773600000,0x0000000774000000)
ParOldGen       total 165376K, used 0K [0x00000006cec00000, 0x00000006d8d80000, 0x000000076f980000)
object space 165376K, 0% used [0x00000006cec00000,0x00000006cec00000,0x00000006d8d80000)
Metaspace       used 2199K, capacity 4480K, committed 4480K, reserved 1056768K
class space    used 233K, capacity 384K, committed 384K, reserved 1048576K

截图引用R大在知乎的回答,很好的回答了这个问题
在这里插入图片描述
验证R大的回答
如下图,第一次不加-XX:-UseParallelOldGC,第二次加上,看到两次输出的一样,说明我使用的java8版本开启了ParalleGC后自动开启了ParallelOldGC
在这里插入图片描述

手动敲个测试代码,测试Full GC,结果如下
在这里插入图片描述

答案

java8 默认的垃圾收集器是Parallel Scavenge + Parallel Old

参考

JVM默认老年代回收是 PSMarkSweep(Serial-Old) 还是Parallel Old?
GC参数的疑惑

猜你喜欢

转载自blog.csdn.net/chen462488588/article/details/112850040