什么是 Java 的垃圾回收机制?有哪些常见的垃圾回收算法?
推荐答案
面试题:什么是 Java 的垃圾回收机制?有哪些常见的垃圾回收算法?
总结性回答
Java 的垃圾回收机制(Garbage Collection, GC)是 JVM 自动管理内存的核心机制,它负责自动回收不再使用的对象占用的内存空间。常见的垃圾回收算法包括:标记-清除算法、复制算法、标记-整理算法、分代收集算法等。现代 JVM 通常采用分代收集策略,结合多种算法来优化垃圾回收性能。
详细解释
1. Java 垃圾回收机制
Java 垃圾回收机制的主要特点:
- 自动内存管理:开发者无需手动释放内存,由 JVM 自动完成
- 基于可达性分析:通过 GC Roots 对象作为起点,判断哪些对象可达(存活),哪些不可达(可回收)
- Stop-The-World:垃圾回收时会暂停所有应用线程(某些并发收集器可以部分避免)
垃圾回收的主要工作:
- 识别哪些对象不再被使用
- 回收这些对象占用的内存空间
- 整理内存碎片(某些算法)
2. 常见垃圾回收算法
(1) 标记-清除算法(Mark-Sweep)
- 过程:
- 标记阶段:遍历所有可达对象并标记
- 清除阶段:回收未被标记的对象内存
- 优点:实现简单
- 缺点:
- 产生内存碎片
- 效率不高(需要两次遍历)
(2) 复制算法(Copying)
- 过程:
- 将内存分为两块,每次只使用一块
- 将存活对象复制到另一块内存
- 清除原内存块
- 优点:
- 无内存碎片
- 效率高(只需一次遍历)
- 缺点:
- 内存利用率只有50%
- 对象存活率高时效率低
(3) 标记-整理算法(Mark-Compact)
- 过程:
- 标记阶段:同标记-清除
- 整理阶段:将所有存活对象向一端移动
- 清除边界外的内存
- 优点:
- 无内存碎片
- 内存利用率高
- 缺点:
- 移动对象成本高
(4) 分代收集算法(Generational Collection)
现代 JVM 主要采用此策略,基于对象生命周期特点将堆内存分为不同代:
- 年轻代(Young Generation):
- 使用复制算法(如 Serial、ParNew、Parallel Scavenge)
- 分为 Eden 区和两个 Survivor 区
- 老年代(Old Generation):
- 使用标记-清除或标记-整理算法(如 CMS、G1、Serial Old、Parallel Old)
- 永久代/元空间(Java 8 后为 Metaspace)
3. 现代垃圾收集器
JVM 提供了多种垃圾收集器实现:
- Serial GC:单线程收集器,适合客户端应用
- Parallel GC:多线程并行收集,注重吞吐量
- CMS(Concurrent Mark-Sweep):并发低停顿收集器
- G1(Garbage-First):面向服务端的收集器,兼顾吞吐量和停顿时间
- ZGC:JDK11+ 引入,目标极低停顿时间
- Shenandoah:类似 ZGC 的低停顿收集器
每种收集器都有其适用场景,选择时需要根据应用特点(吞吐量优先/低延迟优先)和硬件条件来决定。