Java 中有哪些垃圾回收算法?

最后更新:1/12/2026

AI 助手

会员专享功能

只有会员才能使用 AI 生成答案功能。 立即升级

Other Answers (2)

Java 中的垃圾回收算法

Java 虚拟机(JVM)提供了多种垃圾回收(GC)算法,每种算法针对不同的应用场景和性能需求。以下是主要的垃圾回收算法:

1. 标记-清除算法(Mark-Sweep)

基本原理

  • 标记阶段:遍历所有可达对象并标记
  • 清除阶段:回收未被标记的对象内存

特点

  • 简单直接
  • 会产生内存碎片
  • 适用于老年代(Old Generation)
java
// 概念性伪代码
void markSweep() {
    // 标记阶段
    markRoots();
    markFromRoots();
    
    // 清除阶段
    sweep();
}

2. 复制算法(Copying)

基本原理

  • 将内存分为两块,每次只使用其中一块
  • 垃圾回收时将存活对象复制到另一块内存
  • 清理原内存块的全部空间

特点

  • 无内存碎片
  • 需要双倍内存空间
  • 适用于新生代(Young Generation)

3. 标记-整理算法(Mark-Compact)

基本原理

  • 标记阶段与标记-清除相同
  • 整理阶段将所有存活对象向一端移动
  • 清理边界以外的内存

特点

  • 解决了内存碎片问题
  • 移动对象需要时间开销
  • 适用于老年代
java
// 概念性伪代码
void markCompact() {
    // 标记阶段
    markRoots();
    markFromRoots();
    
    // 整理阶段
    compact();
}

4. 分代收集算法(Generational)

基本原理

  • 基于对象生命周期假说(大部分对象很快变成垃圾)
  • 将堆内存分为新生代(Young Generation)和老年代(Old Generation)
  • 新生代使用复制算法
  • 老年代使用标记-清除或标记-整理算法

特点

  • 现代JVM主要采用的方式
  • 针对不同代优化回收策略

5. 增量收集算法(Incremental)

基本原理

  • 将GC过程分成多个小步骤执行
  • 每次只回收部分垃圾
  • 与应用程序线程交替执行

特点

  • 减少单次GC停顿时间
  • 总体GC时间可能增加

6. G1垃圾回收器(Garbage-First)

基本原理

  • 将堆划分为多个大小相等的区域(Region)
  • 优先回收垃圾最多的区域(Garbage-First)
  • 兼具标记-整理和复制算法的特点

特点

  • JDK 9+的默认GC
  • 适用于大内存机器
  • 可预测停顿时间模型

7. ZGC和Shenandoah

新一代低延迟GC

  • ZGC:JDK 11引入,目标停顿时间不超过10ms
  • Shenandoah:JDK 12引入,

延迟GC

特点

  • 并发标记和整理
  • 极低停顿时间
  • 适用于大内存和低延迟要求的应用

如何选择GC算法

选择GC算法时考虑:

  • 吞吐量 vs 延迟
  • 堆内存大小
  • 应用特性(如创建对象的速度)

现代JVM通常会自动选择最适合的GC,但也可以通过JVM参数手动指定:

bash
# 使用G1 GC
java -XX:+UseG1GC MyApp

# 使用ZGC
java -XX:+UseZGC MyApp

# 使用Shenandoah
java -XX:+UseShenandoahGC MyApp

理解这些GC算法有助于开发者优化Java应用程序的内存使用和性能表现。