JVM垃圾回收核心逻辑主线是“回收什么→怎么判断→何时触发→如何回收→如何控制”:回收对象以可达性分析(GC Roots出发)为唯一判定标准,弃用引用计数法;新生代Eden满触发Minor GC,老年代空间不足等触发Full GC;算法按代分工——复制法用于新生代,标记-清除/整理用于老年代;强、软、弱、虚四种引用提供差异化回收控制。

画JVM垃圾回收核心知识点的思维导图,关键不是堆砌术语,而是理清逻辑主线:**“回收什么 → 怎么判断 → 何时触发 → 如何回收 → 如何控制”**。围绕这条线展开,结构自然清晰,也贴合面试和实战需求。
一、回收对象:从“存活判定”切入
这是整个GC的起点,不搞清哪些对象该回收,后续都无从谈起。
- 可达性分析算法是唯一实际采用的方法:以GC Roots为起点(栈帧局部变量、静态属性、常量、JNI引用),不可达即为垃圾
- 引用计数法仅作了解——因循环引用缺陷被HotSpot弃用
- 注意区分对象死亡的两次标记过程:第一次标记 → 若重写finalize且未执行过,放入F-Queue → 等待第二次标记(仅一次机会)
二、回收时机:分代假设 + 触发条件
JVM不是随时乱收,而是基于“分代收集理论”按区域和频率差异化处理。
- 新生代:对象朝生夕死,频繁Minor GC;触发条件通常是Eden区满
- 老年代:对象存活久,较少Full GC;触发条件包括:老年代空间不足、Minor GC后晋升失败、元空间/永久代耗尽、显式System.gc()(不保证执行)
- 元空间:类元数据过多或MetaspaceSize设置过小也会触发GC
三、回收算法:三类基础 + 分代组合
每种算法解决不同场景痛点,不是孤立存在,而是按代搭配使用。
- 标记-清除:老年代基础算法;优点是不移动对象;缺点是碎片化、效率低
- 标记-复制:新生代主力(Eden+S0/S1);解决碎片问题;代价是内存减半(实际通过8:1:1比例优化至90%利用率)
- 标记-整理:老年代备选(如Serial Old、CMS后期);避免碎片又不浪费空间;但移动对象开销大
- 补充:分代收集不是独立算法,而是策略:新生代用复制,老年代用清除或整理
四、引用类型:影响GC行为的“软开关”
四种引用本质是给GC提供回收优先级提示,直接决定对象能否被及时释放。
- 强引用:new出来的对象,默认强度;不置null就不会回收
- 软引用:内存不足时才回收;适合缓存(如图片、JSON解析结果)
- 弱引用:GC时必回收;适合临时映射(如WeakHashMap的key)
- 虚引用:唯一不能通过get()获取对象的引用;仅用于跟踪对象被回收的时机(配合ReferenceQueue)











