标记-复制算法
半区复制(Semispace Copying)
将可用内存按照容量划分为大小相等的两块,每次只使用其中的一块。
当一块的内存用完了,将存活的对象复制到另一块,然后将已使用的
内存空间一次清理掉。
注意!复制算法的高效是建立在大部分对象都"朝生夕灭"的特性上的,
如果存活对象过多,复制对象并维持其正确性就成为一个沉重的负担。
实际上并不需要按照1:1划分新生代。
实际的处理方式
HotSpot
虚拟机的Serial
、ParNew
等新生代收集器均使用这种算法。
将新生代分为一块较大的Eden
空间和两块较小的Survivor
空间,
每次分配只使用Eden
和其中的一块Survivor
,发生垃圾收集时,
将Eden
和Survivor
中的存活对象一次性复制到另一块Survivor
中,
之后直接清理掉Eden
和用过的那块Survivor
区。
HotSpot
虚拟机默认Eden
和Survivor
的比例是8:1。
分配担保(Handle Promotion)
复制回收时,如果存活对象的大小大于Survivor
时,这些对象直接进入老年代。
相关配置例子
配置 | 场景 | 解释 |
---|---|---|
-XX:SurvivorRation=65536 -XX:MaxTenuringThreshold=0 或-XX:+AlwaysTenure |
新生代使用的是基于标记-复制算法的垃圾收集器。程序中创建的都是较大对象且生存较久。 | 直接将Survivor 区去掉,让新生代中存活的对象在第一次Minor GC 后立即进入老年代,等到Major GC 时再清理它们。避免大对象在新生代多次复制 |