垃圾回收器

组合 305be7283075e9089e3f6ca042fcea0adba1c8a8

parNew

复制多线程

ee985052c3935317582a64ce7ea7dcc18e472996

Serial:

复制

584902c65220c08e5139c3e8dd55115ab87c37e4

Serial_Old:

标记整理

d24ad49fb2e887e71873c8d92b48bdf5caecaa4b

CMS:

Concurrent

同时发生,

只清除不整理,

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

4686d8705df6364e452097772f86631452610a97

执行步骤

32572b20ae4f3211e16863d54c4148d91a4eadbe

a3b4d5a3e00fab8976824cd3b3b9fdf69a0e18a4

吞吐量 && 停顿时间

吞吐量= app/(app+gcTime)

a71f4bb20588b68f8b3d5f0edd30345c95e87432

G1垃圾回收器:

G1 本质是

分区 +

标记-复制

+ 并发

+ 可控停顿的综合算法。

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

概述

7297ca89ae04710ee82b812009feea62c0b65f67

内存结构:分块

07d2a4fbb0617d94ce05fd7ed3cd2e2c1fc840c8

a5242a386600f8f366b3159561e802cfd6274cc3

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

算法流程:

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