JVM垃圾回收机制介绍
Java虚拟机(JVM)的垃圾回收(GC)机制是Java内存管理的核心部分,它自动回收不再使用的对象占用的内存空间。以下是JVM垃圾回收机制的主要要点:
基本原理
- 自动内存管理:开发者无需手动释放内存,由JVM自动完成
- 可达性分析:通过GC Roots(如栈帧中的局部变量、静态变量等)作为起点,标记所有可达对象
- 分代收集:根据对象生命周期将堆内存划分为不同区域
内存分代
JVM堆内存通常分为以下几代:
-
新生代(Young Generation)
- Eden区:新创建的对象首先分配在这里
- Survivor区(From/To):存放经过Minor GC后存活的对象
- 采用"复制算法"进行回收
-
老年代(Old Generation)
- 存放长期存活的对象
- 采用"标记-清除"或"标记-整理"算法
-
永久代/元空间(PermGen/Metaspace)
- 存放类元数据等信息(Java 8后改为Metaspace)
垃圾回收算法
-
标记-清除(Mark-Sweep)
- 标记所有需要回收的对象
- 统一清除被标记对象
- 会产生内存碎片
-
复制算法(Copying)
- 将内存分为两块,每次使用一块
- 将存活对象复制到另一块
- 适用于对象存活率低的场景(如新生代)
-
标记-整理(Mark-Compact)
- 标记存活对象
- 将存活对象向一端移动
- 清理边界外的内存
- 避免内存碎片
-
分代收集(Generational Collection)
- 结合多种算法,针对不同代使用最适合的算法
垃圾回收器类型
- Serial收集器:单线程,适合客户端应用
- Parallel/Throughput收集器:多线程,追求高吞吐量
- CMS(Concurrent Mark Sweep)收集器:并发收集,减少停顿时间
- G1(Garbage-First)收集器:面向服务端,可预测停顿时间
- ZGC和Shenandoah:新一代低延迟收集器(Java 11+)
GC触发条件
- Minor GC/Young GC:Eden区满时触发
- Major GC/Old GC:老年代满时触发
- Full GC:整个堆内存(包括方法区)进行回收
性能调优参数
常见JVM GC调优参数:
-Xms/-Xmx:初始/最大堆大小-XX:NewRatio:新生代与老年代比例-XX:SurvivorRatio:Eden与Survivor区比例-XX:+UseG1GC:启用G1收集器
JVM的垃圾回收机制通过自动内存管理大大简化了开发工作,但理解其原理对于性能调优和解决内存相关问题至关重要。