JVM中的垃圾回收算法-4.分代收集算法:

时间:2025-03-28 19:23:40

        原理:是最常用的算法,根据对象存存活周期,将堆内存分为新生代和老年代,在新生代中                       应用复制算法(Eden+Survivor)、在老年代中应用标记清除算法+标记整理算法。

        在进行垃圾回收(GC)的时候,在新生代进行复制清除算法,将Eden区的存活对象复制到Survivor区,而Survivor区又分为几个大小相等的s0、s1、s2区(也可理解为from survivor区和to survivor区),首先会将存活对象移动到s0区,然后清除Eden区,在Survivor区中同样进行复制算法,比如(Eden+s0->s1),对象年龄+1,最终经历过14次(或达到阈值-XX:MaxTenuringThreshold=15)GC仍未被回收的对象将被视为长期存活对象,会被放入老年代,而对象本身较大(大于1/2老年代空间的对象会直接被放入老年代,或通过 -XX:PretenureSizeThreshold设置阈值),在老年代中基本不进行垃圾回收(仅在发生FullGC的时候进行垃圾回收)。

        优点:将存活周期长的对象和存活周期短的对象分开存储,减少了内存扫描次数和范围

        原理图:

对象分配 → Eden区
  ↓
Eden满 → Minor GC
  ↓
存活对象复制到 Survivor区(年龄+1)
  ↓
年龄 ≥ 阈值 或 Survivor不足 → 晋升到老年代
  ↓
老年代空间不足 → 触发 Full GC