编辑
2026-01-18
JVM
00
请注意,本文编写于 54 天前,最后修改于 54 天前,其中某些信息可能已经过时。

目录

答案
书本中的线索
打印命令行默认参数
细节

答案

先说结论:JDK 8 默认的垃圾回收器,是【Parallel Scavenge + Parallel Old】组合(并行新生代收集器 + 并行老年代收集器),也被统称为「Parallel GC(并行垃圾回收器)」

书本中的线索

周志明的《深入理解Java虚拟机 第3版》3.7.4章节 提及到:

参数描述
UseParallel GCJDK 9 之前虚拟机运行在Server模式下的默认值,打开此开关后,使用 Parallel Scavenge + Serial Old (PS MarkSweep) 的收集器组合进行内存回收

需要说明一下, Parallel Scavenge 收集器架构中本身有 PS MarkSweep 收集器来进行老年代收集, 并非直接调用 Serial Old 收集器, 但是这个 PS MarkSweep 收集器与 Serial Old 的实现几乎是一样的, 所以在官方的许多资料中都是直接以 Serial Old 代替 PS MarkSweep 进行讲解, 这里笔者(周志明)也采用这种方式。

打印命令行默认参数

这个问题可以通过打印 Java 默认参数来得到一些线索:

powershell
PS 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:+UseSerialGCSerial + Serial Old
-XX:+UseParNewGCParNew + Serial Old
-XX:+UseParallelGCParallel Scavenge + Serial Old
-XX:+UseParallelOldGCParallel Scavenge + Parallel Old
-XX:+UseConcMarkSweepGCCMS + ParNew
-XX:+UseG1GCG1

细节

周志明的书中有一段备注信息:

需要说明一下, Parallel Scavenge 收集器架构中本身有 PS MarkSweep 收集器来进行老年代收集, 并非直接调用 Serial Old 收集器, 但是这个 PS MarkSweep 收集器与 Serial Old 的实现几乎是一样的, 所以在官方的许多资料中都是直接以 Serial Old 代替 PS MarkSweep 进行讲解, 这里笔者(周志明)也采用这种方式。

这段话其实是这个意思:

  1. PS MarkSweep 只是回收器的别名,他可以指代 Serial Old 和 Parallel Old。
  2. -XX:+UseParallelGC-XX:+UseParallelOldGC 都是用 Parallel Old

参考这个 JDK commit 信息

image.png

在 JDK 7U4 之前确实 UserParallelGC 用的就是 Serial,在这个版本之后 Parallel 已经很成熟了,所以直接替换了旧的收集器,所以 JDK 7u4 以后的 7 和 JDK 8 老年代默认使用的都是 Parallel 收集器,只是周志明的书中没有更新这个细节。

本文作者:菜宝熊

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!