垃圾回收器

组合 image1

parNew

复制多线程

image2

Serial:

复制

image3

Serial_Old:

标记整理

image4

CMS:

Concurrent

同时发生,

只清除不整理,

因此想要分配对象(连续空间)就得连续空间,需要调用SerialOld帮忙整理出来

image5

执行步骤

吞吐量 && 停顿时间

吞吐量= app/(app+gcTime)

image8

G1垃圾回收器:

G1 本质是

分区 +

标记-复制

+ 并发

+ 可控停顿的综合算法。

对老年代的清理会选择存活度较低的区域, 也是Garbage first的由来

概述

image9

内存结构:分块

================

算法流程:

1. 年轻代收集(Minor GC)

  • 触发条件:Eden 空间不足。

  • 算法:

    1. 标记 Eden 和 Survivor 的存活对象。

    2. 将幸存对象复制到 Survivor 或老年代 Region(根据年龄)。

  • 停顿:STW,短时间完成。

2. 并发标记周期(Concurrent Mark)

  • 触发条件:老年代占用超过阈值,定期触发。

  • 步骤:

    1. 初始标记(STW):标记 GC Roots 可达对象。

    2. 并发标记:应用线程运行时并发扫描老年代存活对象。

    3. 重新标记(STW):修正并发阶段遗漏。

    4. 计算回收收益:统计每个 Region 的垃圾比例 → 生成回收列表。

3. 混合回收(Mixed GC)

  • 触发条件:并发标记结束,老年代回收周期。

  • 算法:

    1. 回收年轻代 Eden + Survivor Regions(必选)。

    2. 回收部分老年代 Region(垃圾比例高的 Region 优先)。

    3. 将幸存对象移动到老年代或 Survivor Regions,整理碎片。

没内存空间了还是会进行Full GC: 单线程执行标记整理法 导致应用程序暂停

小结

JDK8及以前:
关注暂停时间: parNew+CMS

关注吞吐量: Parallel Scavenge+Parallel Old

JDK9以后G1