何时进行GC
垃圾回收(GC)主要分为两类:Minor GC(也称Young GC)和Full GC(或Major GC)**,主要依据内存使用情况和对象生命周期进行触发。
- Minor GC主要针对**年轻代(Young Generation),当Eden区满时触发。存活对象被复制到Survivor区,经过几次GC后年龄足够老的对象晋升至老年代。
- Full GC清理**整个堆内存,包括年轻代和老年代。当老年代空间不足时触发,或年轻代晋升失败(对象太大无法容纳于老年代剩余空间)时。
GC的触发是自动的,系统根据内存使用状况动态决策,不可精确预测。
何物:可达性分析与GC Roots
JVM通过可达性分析判断对象是否可回收,基于GC Roots(根对象集合)开始追溯。根对象包括:
- 活栈帧中的本地变量
- 静程
- 静象静态字段
- JNI引用
未被根引用的对象被视为不可达,可回收。
如何行动:回收过程
新生代主要采用复制算法,老年代采用标记-整理(Mark-Compact)或标记-清除(Mark-Sweep)算法。
-
新生代:
- Eden区满,存活对象复制到Survivor区。 - 经历次GC,对象在Survivor间迁移,年龄增长。 - 达阈值,晋升至老年代。
- 复制算法避免内存碎片,提升分配效率,但牺牲了部分空间。
-
老年代:
- 标记清除:标记存活对象,清除不可达对象。 - 整理:标记后,移动存活对象,消除碎片,更新引用。
-
适用于对象生存周期长、碎片整理,但处理成本较高。
标记-清除:遍历对象图,标记可达对象,清除未标记对象。缺点是效率低,留下碎片。
标记-整理在清除基础上,移动存活对象,更新引用,减少碎片,但成本更高。
JVM根据内存使用模式、对象年龄、代际需求,动态选择算法,以优化GC时机和策略,确保内存高效管理。