Java垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的一项核心功能,负责自动管理和释放不再使用的内存,以确保程序的内存效率和稳定性。Java的内存区域划分为几个主要部分:新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation,现已被元空间(Metaspace)替代)。
1. **分代收集算法**:
- 新生代(Young Generation)是GC最频繁发生的地方,主要包括Eden区和两个Survivor区。Eden区是新创建对象的默认区域,Survivor区用于临时存放Eden区存活的对象,当Survivor区放不下时,对象会被晋升到Old Generation。
- 老年代(Old Generation)较少进行GC,主要用于长期存活的对象,这些对象在经历多次Minor GC后仍存活,就会晋升至此。
- 永久代(元空间)在现代JDK中已不直接参与GC,元空间存储类的静态字段和方法,它的大小通常固定,不会自动扩展。
2. **GC类型**:
- **普通GC(Minor GC)**:专指针对新生代的回收,采用复制算法,如Copy-on-Write(写时复制)。它将Eden区和一个Survivor区中的存活对象复制到另一个Survivor区,然后清理原区域。
- **全局GC(Major GC或Full GC)**:较少发生,涉及老年代和可能的新生代,是更深层次的内存清理,当老年代空间不足或者对象生命周期较长,触发Minor GC不足以解决内存压力时,会进行Full GC。
3. **引用计数法**:
- 这种算法不是Java GC的主要策略,但作为一种理论上的概念,它通过跟踪每个对象的引用计数来确定是否可被回收,但在实际应用中存在许多问题,例如循环引用导致的引用计数无法正确计算。
4. **复制算法(Copying)**:
- 在HotSpot JVM中,年轻代采用复制算法,通过两个Survivor区实现。对象在Eden区出生后经历一次Minor GC,如果存活,则复制到另一个Survivor区。对象年龄(默认15次 Minor GC)达到阈值(可通过-XX:MaxTenuringThreshold设置)后,会被移入老年代。
Java的垃圾回收机制是一种动态内存管理策略,通过区分不同生命周期的内存区域,结合适当的算法(如复制、标记清除等),有效地回收无用内存,保持系统的稳定性和性能。理解这些原理对于Java开发者优化代码、避免内存泄露和理解JVM调优至关重要。