Java 中的垃圾回收(Garbage Collection, GC)算法是 JVM 自动管理内存的核心机制。以下是 Java 中常见的垃圾回收算法:
1. 标记-清除算法(Mark-Sweep)
- 原理:
- 分为两个阶段:标记阶段和清除阶段。
- 标记阶段:从根对象(如 GC Roots)开始,遍历所有可达对象并标记为存活。
- 清除阶段:遍历堆内存,回收未被标记的对象(即垃圾)。
- 优点:实现简单。
- 缺点:
- 会产生内存碎片。
- 效率较低,尤其是堆内存较大时。
2. 复制算法(Copying)
- 原理:
- 将内存分为两块(From 和 To 区),每次只使用其中一块。
- 在垃圾回收时,将存活对象从 From 区复制到 To 区,然后清空 From 区。
- 优点:
- 不会产生内存碎片。
- 适合存活对象较少的场景(如年轻代)。
- 缺点:
- 内存利用率较低,只能使用一半的内存。
- 复制大量存活对象时效率较低。
3. 标记-整理算法(Mark-Compact)
- 原理:
- 分为标记阶段和整理阶段。
- 标记阶段:标记所有存活对象。
- 整理阶段:将存活对象向内存的一端移动,然后清理边界外的内存。
- 优点:
- 不会产生内存碎片。
- 适合老年代回收。
- 缺点:
- 整理阶段需要移动对象,效率较低。
4. 分代收集算法(Generational Collection)
- 原理:
- 基于对象的生命周期将堆内存分为年轻代(Young Generation)和老年代(Old Generation)。
- 年轻代使用复制算法(如 Minor GC)。
- 老年代使用标记-清除或标记-整理算法(如 Full GC)。
- 优点:
- 针对不同生命周期的对象采用不同的回收策略,效率较高。
- 缺点:
- 需要额外的开销来管理分代。
5. 增量收集算法(Incremental Collection)
- 原理:
- 将垃圾回收过程分为多个小步骤,与应用程序交替执行。
- 每次只回收一部分垃圾,减少单次停顿时间。
- 优点:
- 减少应用程序的停顿时间。
- 缺点:
- 总体回收效率较低。
6. 并发标记清除算法(CMS, Concurrent Mark-Sweep)
- 原理:
- 分为初始标记、并发标记、重新标记和并发清除四个阶段。
- 大部分工作与应用程序并发执行,减少停顿时间。
- 优点:
- 停顿时间短,适合低延迟应用。
- 缺点:
- 会产生内存碎片。
- 并发模式失败时会导致 Full GC。
7. G1 垃圾回收算法(Garbage-First)
- 原理:
- 将堆内存划分为多个大小相等的区域(Region)。
- 采用标记-整理和复制算法,优先回收垃圾最多的区域(Garbage-First 策略)。
- 优点:
- 可预测的停顿时间。
- 适合大内存、低延迟场景。
- 缺点:
- 实现复杂,调优难度较高。
8. ZGC(Z Garbage Collector)
- 原理:
- 基于并发标记和并发整理的算法。
- 使用指针着色技术(Pointer Coloring)实现高效的并发回收。
- 优点:
- 停顿时间极短(通常小于 10ms)。
- 支持超大堆内存(TB 级别)。
- 缺点:
- 需要较高的硬件资源支持。
9. Shenandoah GC
- 原理:
- 类似于 ZGC,采用并发标记和并发整理的算法。
- 通过 Brooks 指针实现并发整理。
- 优点:
- 停顿时间短。
- 适合大内存、低延迟场景。
- 缺点:
- 需要较高的硬件资源支持。
总结
Java 中的垃圾回收算法主要包括:
- 标记-清除
- 复制算法
- 标记-整理
- 分代收集
- 增量收集
- CMS
- G1
- ZGC
- Shenandoah GC
不同的算法适用于不同的场景,JVM 会根据堆内存大小、应用性能需求等因素选择合适的垃圾回收器。
THE END
暂无评论内容