标记:它的第一个阶段与标记-清除算法是一模一样的,均是遍历 GC Roots
,然后将存活的对象标记。
整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段。
这是一种老年代的垃圾收集算法。老年代的对象一般寿命比较长,因此每次垃圾回收会有大量对象存活,如果采用复制算法,每次需要复制大量存活的对象,效率很低。
优点:
- 消除了标记清除算法内存区域分散的缺点
- 消除了复制算法中,内存减半代价
缺点:
- 从效率上来讲,标记整理算法要低于复制算法
- 移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址
- 移动的过程中,需要全程暂停用户应用程序,即STW