1. 垃圾回收器的分类
- 按线程数:串行垃圾和并行
- 按工作模式:并发式和独占式
- 并发式:垃圾回收线程与用户线程交替工作,减少应用程序的停顿时间。
- 独占式:一旦运行,停止其他用户线程,知道垃圾回收过程结束。
- 按内存碎片情况:
- 压缩:回收完成后,会对存活对象进行内存整理。再次分配时可以使用指针碰撞
- 非压缩:不会整理内存碎片,需要空闲列表来维护可用空间。
- 按工作的内存区域
- 新生代
- 老年代
2. 垃圾回收器的标准
- 在保证最大吞吐量的情况下,尽可能的减少响应时间
3. 垃圾回收器的组合
JDK8中默认的是ParallelScavengeGC +ParllelOldGC
- 红色虚线说明
在JDK8中对SerialGC+CMS GC
和ParNewGC+SerialOldGC
进行来过期处理,在JDK9中彻底移除。 - 绿色虚线说明
在JDK14中,Parallel ScavengeGC+ SerialOldGC
过期处理 - 蓝色线框说明
在JDK14中 ,将CMS删除了
4. 如何查看默认垃圾回收器
JDK8中默认使用的是Parallel ScavengeGC +ParallelOldGC
5. Serial与Serial Old垃圾回收器
Serial
- Serial回收器是历史比较悠久的一种回收器,在jdk1.3之前垃圾回收的唯一选择。
- HotSpot中client模式下的针对年轻代默认垃圾回收器
- SerialGC针对的是年轻代的收集,采用
复制算法
,串行回收
+STW机
制。
Serial Old
HotSpot中client模式下的老年代默认垃圾回收器
SerialOld是针对老年代的回收,也是采用的串行回收,但是算法采用的
标记-压缩
SerialOld 在server模式下,1. 主要是配合Parallel ScavengeGC使用(JDK14中已过期),2. 作为CMS的退化备选方案。
Serial 和SerialOld 的优点:
如何使用
6. ParNew垃圾回收器
- ParNew 是Serial 的并行版本, New代表了只针对新生代进行处理,采用
复制算法
+并行
的方式回收垃圾。 - 适用于多CPU下。大部分情况下与CMS搭配使用。
7. Parallel Scavenge 与Parallel Old垃圾回收器(吞吐量优先)
- Parallel Scavenge 一般和Parallel Old搭配使用,但是也可以和serialOld搭配(在JDK14 中被移除)
- Parallel Scavenge 也采用
复制算法
+并行+STW
机制 - Parallel Scavenge 和ParalleNew 有什么区别:
- Parallel Scavenge的目标是达到一个可控制吞吐量的垃圾回收器。也被称为吞吐量优先垃圾回收器。
- Parallel Scavenge有自适应调节策略。
Parallel Old
- Parallel Old采用
标记压缩
+并行+STW
8. CMS (Concurrent-Mark-Sweep)垃圾回收器(响应时间优先)
- CMS使用的是
标记-清除
算法 - CMS 针对的是老年代,新生代可搭配SerialGC 或ParNewGC
- CMS 会产生2次STW,分别是初始标记,重写标记
- 触发CMS的情况:
- 扩容缩容会触发 Old 区达到回收阈值、MetaSpace 空间不足、Young 区晋升失败、大对象担保失败,手工调用System.gc()
初始标记(Initial-Mark ): 仅仅标记出GCRoot能
直接关联
的对象,会发生STW,执行时间较短。并发标记(Concurrent-Mark): 从GCRoot可以直接关联的对象遍历整个对象图的过程。执行时间较长,但是可以与用户线程并行执行。
重新标记(Remark): 修正并发标记期间,因用户线程线程继续运作而导致标记变动的那一步部分对象的标记记录。通常比Initial-Mark 的执行时间长,但是比Concurrent-Mark要短。 会发生STW。
并发清理: 清除那些需要被删除的对象,释放内存。(标记-清除算法)
重置线程
CMS的特点
- 优点
- 低延迟
- 缺点:
- 产生内存碎片,当遇到大对象时,可能会提前触发full GC当发生
- 对CPU资源敏感,因为与用户线程并行执行,从总体来说降低了吞吐量。
- CMS 发生收集器退化对情况
参考文献:
https://tech.meituan.com/2020/11/12/java-9-cms-gc.html
9. G1垃圾回收器:分区收集
- 核心设计: 延迟可控的情况下,尽可能获得高的吞吐量。
- 主要针对多核心CPU+大内存的机器
为什么叫G1
G1 相比于其他垃圾回收器的特点
-
并行并发&分带收集
-
空间整理
- CMS 使用标记-清除,会有内存碎片,执行若干次GC后才会整理内存。
- G1 将内存划分为Region,在region之间是
复制算法
,当整体上来看是标记-压缩
.两重算法都避免来内存碎片。尤其当java 堆特别大时,G1 的性能更明显。
-
可预测的时间停顿
G1 Region 化整为零
-
G1 Region 为什么要新增一个Humongous区:
G1 的回收过程
年轻代GC(YoungGC)
- 当eden区内存空间不足时,会触发YoungGC
老年代并发标记(Concurrent Marking)
混合回收(Mixed GC)
FullGC
G1垃圾回收过程的详细说明: