标记-复制算法

半区复制(Semispace Copying)

将可用内存按照容量划分为大小相等的两块,每次只使用其中的一块。

当一块的内存用完了,将存活的对象复制到另一块,然后将已使用的

内存空间一次清理掉。

注意!复制算法的高效是建立在大部分对象都"朝生夕灭"的特性上的,

如果存活对象过多,复制对象并维持其正确性就成为一个沉重的负担。

实际上并不需要按照1:1划分新生代。

实际的处理方式

HotSpot虚拟机的SerialParNew等新生代收集器均使用这种算法。

将新生代分为一块较大的Eden空间和两块较小的Survivor空间,

每次分配只使用Eden和其中的一块Survivor,发生垃圾收集时,

EdenSurvivor中的存活对象一次性复制到另一块Survivor中,

之后直接清理掉Eden和用过的那块Survivor区。

HotSpot虚拟机默认EdenSurvivor的比例是8:1。

分配担保(Handle Promotion)

复制回收时,如果存活对象的大小大于Survivor时,这些对象直接进入老年代。

相关配置例子

配置 场景 解释
-XX:SurvivorRation=65536
-XX:MaxTenuringThreshold=0-XX:+AlwaysTenure
新生代使用的是基于标记-复制算法的垃圾收集器。程序中创建的都是较大对象且生存较久。 直接将Survivor区去掉,让新生代中存活的对象在第一次Minor GC后立即进入老年代,等到Major GC时再清理它们。避免大对象在新生代多次复制