内容纲要
在 Java 的垃圾回收(GC)中,堆内存被划分为两个主要区域:新生代(Young Generation)和老生代(Old Generation)。它们的内存回收策略有所不同,因为它们分别处理生命周期不同的对象。以下是它们各自的内存回收策略:
新生代(Young Generation)内存回收策略
新生代主要包含新创建的对象。大多数对象在程序运行时会首先在新生代中创建,生命周期较短。新生代的内存回收策略如下:
-
Minor GC(年轻代回收):
- 新生代回收发生在 年轻代 区域,通常是通过 复制算法(Copying Algorithm)来回收。
- 当新生代的内存使用接近阈值时,垃圾回收器会回收新生代内存并清除无用对象。
- 在回收时,存活的对象会被复制到另一个空闲的区域,通常会在 Eden 空间 和 Survivor 空间 之间进行对象的复制。
- Minor GC 速度较快,因为新生代内存较小,且大部分对象是短生命周期的,容易清除。
-
垃圾收集器类型:
- 新生代回收使用的常见垃圾回收器是 Serial GC、Parallel GC、G1 GC 和 ZGC 等。
老生代(Old Generation)内存回收策略
老生代存储的是生命周期较长的对象,通常是经过多次垃圾回收后仍然存活的对象。老生代的内存回收策略如下:
-
Full GC(完全垃圾回收):
- 老生代的回收通常是通过 标记-清除算法(Mark-Sweep)或 标记-压缩算法(Mark-Compact)来实现的。
- 在 Full GC 时,垃圾回收会遍历整个堆(包括新生代和老生代),并清理无用对象。
- 由于老生代内存较大且存活的对象更多,回收过程比较慢,且可能会导致 Stop-The-World 现象,即所有的应用线程会被暂停,直到垃圾回收完成。
-
对象晋升:
- 当新生代中的对象经过多次垃圾回收后,仍然存活的对象会被晋升到老生代,成为老年代的对象。
- 如果老生代的空间不足,会触发 Full GC。
总结
- 新生代的回收通过 Minor GC 实现,回收速度快,采用复制算法,处理短生命周期的对象。
- 老生代的回收通过 Full GC 实现,回收速度较慢,采用标记-清除或标记-压缩算法,处理长期存活的对象。
这两者的回收策略区别在于内存回收的时机、回收的方式和回收的效率。在 Java 中,优化这两部分的回收策略是提升性能的关键。