先说结论:JDK 8 默认的垃圾回收器,是【Parallel Scavenge + Parallel Old】组合(并行新生代收集器 + 并行老年代收集器),也被统称为「Parallel GC(并行垃圾回收器)」
周志明的《深入理解Java虚拟机 第3版》3.7.4章节 提及到:
| 参数 | 描述 |
|---|---|
| UseParallel GC | JDK 9 之前虚拟机运行在Server模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old (PS MarkSweep) 的收集器组合进行内存回收 |
需要说明一下, Parallel Scavenge 收集器架构中本身有 PS MarkSweep 收集器来进行老年代收集, 并非直接调用 Serial Old 收集器, 但是这个 PS MarkSweep 收集器与 Serial Old 的实现几乎是一样的, 所以在官方的许多资料中都是直接以 Serial Old 代替 PS MarkSweep 进行讲解, 这里笔者(周志明)也采用这种方式。
这个问题可以通过打印 Java 默认参数来得到一些线索:
powershellPS C:\Users\caibh> java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=1068324736 -XX:MaxHeapSize=17093195776 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC java version "1.8.0_202" Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
可以看到打印的默认参数中有一项是 -XX:+UseParallelGC,可以通过下面表格得知该参数对应使用的垃圾回收器(Parallel Scavenge + Serial Old):
| JVM参数 | 垃圾回收器 |
|---|---|
| -XX:+UseSerialGC | Serial + Serial Old |
| -XX:+UseParNewGC | ParNew + Serial Old |
| -XX:+UseParallelGC | Parallel Scavenge + Serial Old |
| -XX:+UseParallelOldGC | Parallel Scavenge + Parallel Old |
| -XX:+UseConcMarkSweepGC | CMS + ParNew |
| -XX:+UseG1GC | G1 |
周志明的书中有一段备注信息:
需要说明一下, Parallel Scavenge 收集器架构中本身有 PS MarkSweep 收集器来进行老年代收集, 并非直接调用 Serial Old 收集器, 但是这个 PS MarkSweep 收集器与 Serial Old 的实现几乎是一样的, 所以在官方的许多资料中都是直接以 Serial Old 代替 PS MarkSweep 进行讲解, 这里笔者(周志明)也采用这种方式。
这段话其实是这个意思:
-XX:+UseParallelGC 和 -XX:+UseParallelOldGC 都是用 Parallel Old参考这个 JDK commit 信息:

在 JDK 7U4 之前确实 UserParallelGC 用的就是 Serial,在这个版本之后 Parallel 已经很成熟了,所以直接替换了旧的收集器,所以 JDK 7u4 以后的 7 和 JDK 8 老年代默认使用的都是 Parallel 收集器,只是周志明的书中没有更新这个细节。
本文作者:菜宝熊
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!