下列关于垃圾回收算法的描述中,错误的是( ):
标记清除算法,采用从根集合进行扫描的方式,对存活的对象进行标记。标记完毕后,再扫描整个空间中未被标记的对象,进行回收。这种方式不需要进行对象的移动,只需要对不存活的对象进行处理,在存活对象比较多的情况下极为高效,但由于它直接回收不存活的对象,因此会造成内存碎片。
复制算法,在开始时把堆分成一个对象面和多个空闲面,程序从对象面为对象分配空间。当对象满了,基于复制算法的垃圾收集器就从根集合中扫描活动对象,并将每个活动对象复制到空闲面,这样空闲面就变成了对象面,原来的对象面变成了空闲面,jvm会在新的对象面中分配内存。
标记整理算法,采用与标记清除算法一样的方式进行对象的标记,但在清除时不同,在回收不存活对象占用的空间后,会将所有的存活对象往左端空闲空间移动,并更新对应的指针。由于此种算法进行了对象的移动,因此成本更高,但是却解决了内存碎片的问题。
分代回收算法,这是目前大部分JVM垃圾回收器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干不同的区域。一般情况下,将堆划分为老年代和新生代,在堆之外再划分一个永久代。老年代的特点是每次垃圾回收时都有大量的对象需要被回收,而新生代的特点是每次垃圾回收时只有少量对象需要被回收,这样就可以根据不同代的特点采取最合适的回收算法了。