标记整理算法、分代收集算法
标记整理算法
复制收集算法在对象存活率较⾼时就要进⾏较多的复制操作,效率将会变低。更关键的是,如果不想浪费 50%的空间,就需要有额外的空间进⾏分配担保,
以应对被使⽤的内存中所有对象都 100%存活的极端情况,所以在⽼年代⼀般不能直接选⽤这种算法
根据⽼年代的特点,有⼈提出了另外⼀种“标记-整理(Mark- Compact)算法,标记过程仍然与“标记-清除”算法⼀样,
但后续步骤不是直接对可回收对象进⾏清理,⽽是让所有存活的对象都向⼀端移动,然后直接清理掉端边界以外的内存
- 图解
将蓝色部分存活的对象移动到最上面,整理成连续的内存,最后将剩余部分全部回收
分代收集算法
⼀般把 Java 堆分为新⽣代和⽼年代,这样就可以根据各个年代的特点采⽤最适当的收集算法
在新⽣代中,每次垃圾收集时都发现有⼤批对象死去,只有少量存活,那就选⽤复制算法,只需要付出少量存活对象的复制成本就可以完成收集。⽽⽼年代中因为对象存活率⾼、
没有额外空间对它进⾏分配担保,就必须使⽤“标记-清理”或者“标记⼀整理”算法来进⾏回收