Java 中有哪些垃圾回收算法?
最后更新:1/12/2026
AI 助手
会员专享功能
只有会员才能使用 AI 生成答案功能。 立即升级
Other Answers (2)
Java 中的垃圾回收算法
Java 虚拟机(JVM)提供了多种垃圾回收(GC)算法,每种算法针对不同的应用场景和性能需求。以下是主要的垃圾回收算法:
1. 标记-清除算法(Mark-Sweep)
基本原理:
- 标记阶段:遍历所有可达对象并标记
- 清除阶段:回收未被标记的对象内存
特点:
- 简单直接
- 会产生内存碎片
- 适用于老年代(Old Generation)
// 概念性伪代码
void markSweep() {
// 标记阶段
markRoots();
markFromRoots();
// 清除阶段
sweep();
}
2. 复制算法(Copying)
基本原理:
- 将内存分为两块,每次只使用其中一块
- 垃圾回收时将存活对象复制到另一块内存
- 清理原内存块的全部空间
特点:
- 无内存碎片
- 需要双倍内存空间
- 适用于新生代(Young Generation)
3. 标记-整理算法(Mark-Compact)
基本原理:
- 标记阶段与标记-清除相同
- 整理阶段将所有存活对象向一端移动
- 清理边界以外的内存
特点:
- 解决了内存碎片问题
- 移动对象需要时间开销
- 适用于老年代
// 概念性伪代码
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参数手动指定:
# 使用G1 GC
java -XX:+UseG1GC MyApp
# 使用ZGC
java -XX:+UseZGC MyApp
# 使用Shenandoah
java -XX:+UseShenandoahGC MyApp
理解这些GC算法有助于开发者优化Java应用程序的内存使用和性能表现。