一、背景:
二、区别:
标记-压缩算法的最终效果等同于标记-清除算法执行完成后,在进行一次内存碎片整理,因此,也可以把它称为标记-清除-压缩(Mark-Sweep-Compact)算法。
二者的本质差异在于标记-清除算法是一种非移动式的回收算法,标记-压缩是移动式的。是否移动回收后的存活对象是一项优缺点并存的风险决策。
可以看到,标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要维持一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。
三、图解 执行过程:
四、优缺点:
优点:
a.消除了标记-清楚算法当中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要维持有一个内存的起始地址即可。
b.消除了复制算法当中,内存减半的高额代价。
缺点:
a.从效率上来说,标记-整理算法低于复制算法。
b.移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址。
c.移动过程中,需要全程暂停用户应用程序。即:STW。