程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

垃圾回收算法:分代回收算法(Generational Garbage Collection)

balukai 2025-07-23 13:04:42 文章精选 3 ℃

分代回收算法(Generational Garbage Collection)是一种垃圾回收技术,用于提高垃圾回收的效率,特别是在内存管理方面。该算法的核心思想是根据对象的生命周期将它们分为不同的代,并对不同代的对象采取不同的回收策略。

分代回收算法的基本概念

  • 年轻代(Young Generation):
  • 包含新创建的对象。
  • 回收频率高,因为大多数对象很快就会变得不可达。
  • 一般分为三个区域:Eden、Survivor From 和 Survivor To。
  • 老年代(Old Generation):
  • 包含生命周期较长的对象,即从年轻代提升上来的对象。
  • 回收频率低,但回收时会占用较长时间。
  • 永久代(Permanent Generation):
  • 存储类信息、方法等相对稳定的数据。
  • 在Java 8及之后被Metaspace取代,不再使用PermGen。

工作流程

  • 年轻代回收(Minor GC):
  1. 对象创建: 新对象被分配到Eden区。
  2. Minor GC: 当Eden区无法分配给新对象足够的存储空间时,就会触发Minor GC。Eden区中的存活对象年龄先+1然后复制到Survivor To区,之后Eden区会整体清空。
  3. Survivor区交换: 当Eden区再一次存满时触发新一次Minor GC时,Eden区和 Survivor To存活对象都会年龄+1,然后判断年龄阀值,超过的晋升老年代,直接复制到老年区,未超过的复制到Survivor From区,如果Survivor From空间不足存储存活对象,超出的部分直接晋级为老年代,复制到老年区,然后Eden区和Survivor To区都会整体清空,并且Survivor To改名为Survivor From,Survivor From改名为Survivor To完成Survivor区交换。
  • 老年代回收(Major GC 或 Full GC):
  1. 当对象晋升到老年代时,通常是直接将这些对象存储到老年代的内存空间中。如果老年代有足够的空闲空间来容纳这些对象,它们会直接被存储在老年代中。
  2. 如果老年代的空间不足以容纳新晋升的对象,JVM会触发老年代的垃圾回收(Full GC 或 Major GC)来清理老年代中的无用对象,以腾出足够的空间。
  3. 老年代的垃圾回收会遍历整个老年代的内存,清除不再使用的对象,尝试回收空间。这个过程可能涉及多种回收策略,如标记-清除、标记-整理等。

新生代晋升为老年代对象条件

  • 如果年轻代的空间不足以容纳新创建的对象或当前存活的对象,垃圾回收器会触发Minor GC。
  • 新生代中的对象会经历多次垃圾回收(Minor GC),每次回收后存活的对象会被移动到Survivor区域并增加年龄计数。
  • 当对象的年龄达到一定阈值(通常是15或从其他配置中得出的),它们会被晋升到老年代。这个阈值可以通过JVM参数进行配置,例如 -XX:MaxTenuringThreshold。

优点

  • 高效的内存回收: 通过频繁回收年轻代中的短命对象,大大减少了老年代中需要回收的对象数量。
  • 减少停顿时间: 年轻代回收过程较快,减少了应用程序的停顿时间。

缺点

  • 复杂性: 实现和调优相对复杂,需要平衡年轻代和老年代的大小、回收频率等。
  • 内存碎片: 在使用标记-清除算法时,可能会产生内存碎片。

Tags:

最近发表
标签列表