JVM垃圾回收算法和分代收集算法的区别
一、概要:
JVM 中的垃圾回收算法是一个广义的概念,包含了所有用于识别和回收无用对象的基本算法思想;而分代收集算法是一种组合式的回收策略,它基于对象的生命周期特征,将上述基本算法应用到不同的内存区域中。简单来说:分代收集算法是垃圾回收算法的一种具体实现方式,是对基本垃圾回收算法的综合运用。
二、垃圾回收算法(基础算法)
指识别和回收垃圾对象的核心思想和基本方法,主要包括以下几类:
标记 - 清除算法(Mark-Sweep)
- 过程:
① 标记:遍历所有对象,标记出可达的存活对象(通过 GC Roots 追溯)。
② 清除:回收所有未被标记的对象(垃圾),释放内存。 - 优缺点:
优点:实现简单,无需移动对象。
缺点:清理后会产生大量内存碎片,可能导致后续大对象无法分配内存;标记和清除过程效率较低(需遍历所有对象)。
- 过程:
复制算法(Copying)
- 过程:
① 将内存分为大小相等的两块(如 From 区和 To 区)。
② 只使用其中一块(From 区),当内存不足时,将存活对象复制到另一块(To 区),然后清空 From 区。 - 优缺点:
优点:无内存碎片,分配内存时只需指针移动,效率高。
缺点:内存利用率低(仅用一半);复制大量存活对象时成本高。
- 过程:
标记 - 整理算法(Mark-Compact)
- 过程:
① 标记:同 “标记 - 清除”,标记存活对象。
② 整理:将所有存活对象向内存一端移动,然后直接清理边界外的内存。 - 优缺点:
优点:解决了 “标记 - 清除” 的内存碎片问题,内存利用率高。
缺点:整理阶段需要移动对象,成本较高(尤其是存活对象多的情况)。
- 过程:
三、分代收集算法(组合策略)
分代收集算法不是独立的新算法,而是根据对象的生命周期长短,将堆内存划分为不同区域(如新生代、老年代),并为每个区域选择最适合的基础垃圾回收算法。
核心依据:对象的生命周期特征
- 新生代(Young Generation):
绝大多数对象创建后很快成为垃圾(如局部变量),存活时间短,存活率低。- 老年代(Old Generation):
少数对象存活时间长(如缓存对象、单例对象),存活率高,且可能被长期引用。
对于新生代,内部又被分为了三个区域。Eden区,S0区,S1区【8:1:1】
当对新生代产生GC:MinorGC【young GC】
当对老年代代产生GC:Major GC
当对新生代和老年代产生FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长,应尽力避免
(一)分代回收的具体实现
新生代:采用复制算法
- 原因:新生代对象存活率低,复制成本低,且复制算法无碎片、分配效率高。
- 细节:新生代进一步分为 Eden 区(80%)和两个 Survivor 区(From/To 各 10%)。对象优先在 Eden 区分配,回收时将 Eden 和 From 区的存活对象复制到 To 区,然后清空 Eden 和 From 区,From/To 区角色互换。
老年代:采用标记 - 清除或标记 - 整理算法
- 原因:老年代对象存活率高,若用复制算法会导致大量复制操作,效率低;而标记 - 清除 / 整理算法适合处理存活对象多的场景(虽然整理有移动成本,但老年代回收频率低)。
分代回收操作示例如下:
①新创建的对象,都会先分配到eden区
②当伊甸园内存不足,标记伊甸园与 from(现阶段没有)的存活对象,将存活对象采用复制算法复制到 to 中,复制完毕后,伊甸园和 from 内存都得到释放
③经过一段时间后伊甸园的内存又出现不足,标记eden区域to区存活的对象,将存活的对象复制到from区
④之后一直重复上述过程,当幸存区对象熬过几次回收(最多15次),晋升到老年代(幸存区内存不足或大对象会导致提前晋升)
(二)MinorGC、 Mixed GC 、 FullGC的区别是什么
MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
FullGC: 新生代 + 老年代完整垃圾回收,暂停时间长(STW),应尽力避免?
STW(Stop-The-World):暂停所有应用程序线程,等待垃圾回收的完成
四、区别与关系
维度 | 垃圾回收算法(基础算法) | 分代收集算法(组合策略) |
---|---|---|
本质 | 独立的垃圾回收思想(如标记 - 清除、复制等) | 基于对象生命周期的分区域回收策略 |
适用场景 | 通用的垃圾回收逻辑 | 针对不同生命周期的对象优化回收效率 |
与其他算法的关系 | 独立存在,可单独使用 | 依赖基础算法(如新生代用复制,老年代用标记 - 整理) |
目的 | 解决 “如何回收垃圾” 的问题 | 解决 “如何更高效回收不同类型对象” 的问题 |
关系:分代收集算法是对基础垃圾回收算法的按需组合和优化,属于垃圾回收算法的一个子集。现代 JVM(如 HotSpot)的垃圾收集器(如 G1、CMS)均基于分代收集思想设计,同时结合了多种基础算法的优点。
五、总结
基础垃圾回收算法是 “工具”,解决了垃圾回收的基本逻辑(标记、清除、复制、整理)。
分代收集算法是 “策略”,通过划分内存区域,为不同区域选择最合适的 “工具”,从而提升整体回收效率。
可以说,分代收集算法是 JVM 对基础垃圾回收算法的工程化应用,是实践中优化垃圾回收性能的核心方案。