面试题:Java 中有哪些垃圾回收算法?

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
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容