前两天面试碰到一个比较有意思的问题:为何新生代和老年代采取的算法不一样?
众所周知,新生代所采取的算法是标记-复制算法(复制算法),老年代采用的是标记-清除算法和标记–整理算法。
最早出现的垃圾收集算法是“标记-清除”算法,但是他主要有两个缺点:1.执行效率不稳定,如果堆中大部分对象需要回收,那么需要进行大量标记和清除动作,执行效率会随着对象数量增长而降低。2.内存空间的碎片化问题。
对于新生代而言,因为需要面对的大部分对象都是可回收的对象,所以标记-复制算法应运而生。
因为该算法只需要复制的只是占少数的存活对象,而且分配内存是不用考虑有空间碎片的情况,只需要移动堆顶指针,按顺序分配即可,实现简单,运行高效,十分适合新生代那些大部分“朝生夕灭”的对象。
但是,复制算法在对象存活率较高时,需要较多的复制操作,效率会降低,尤其是该算法会浪费掉一部分内存,所以不适合老年代。这个时候“标记-清除算法”以及“标记-整理算法”便可以发挥他们的作用了。