标记整理算法 的是 标记清除算法 的基础上有做了‘ 整理 ’阶段的操作。也可以看做是标记清除算法的优化。
标记清除算法与标记整理算法步骤对比:
标记清除 : 标记-清除
标记整理 : 标记–整理-清除
有关标记清除算法的思想原理请参阅:
【JVM】垃圾回算法-标记清除算法
在前几篇关于垃圾回收算法中,标记复制算法可以说是似乎很完美了,但在真实情况下,有部分地方的对象回收如果使用标记复制算法还是不行的,比如说老年代中的对象。
标记整理算法背景:
大家都知道,堆中对象的存放位置大致有:新生代、老年代,新生代中的对象可以说是朝生夕灭,因此针对与新生代中的对象而言,使用复制算法可以说很合适了。
但是老年代中的对象经过GC巡逻后大多数仍是存活的,此时对老年代对象使用标记复制算法,之前说的关于标记复制算法的缺点弊端都会显现出来–效率低下(因为需要复制的对象变多了)
如果对老年代使用标记清除算法则会有 碎片化空间 、 效率低下 等缺点,也不适用到老年代。那这不完犊子了么,老年代中的对象该使用那种算法来回收最好呢?
1970年左右,一种新的垃圾回收算法出现了:
标记-整理(压缩)算法(Mark-Compact)
标记整理算法执行步骤:
1、标记存活对象
该步骤使用根可打算法标记出存活对象。
2、整理存活对象
有序地整理存活对象,在整理的同时,之前对象的在 虚拟机 栈中的引用地址也发生改变。
3、清除非存活对象
标记整理算法的优缺点:
优点 (解决别人的缺点就是自己的优点):
1、(相比于标记清除算法) 没有了碎片化内存
2、(相比于标复制算法) 没有了内存减半的消耗
缺点 :
1、在整理存活对象时,因为对象位置点变动, 还需要该调整虚拟机栈中的引用地址
2、在整理存活对象时, 需要全程暂停用户线程,STW(Stop The World)
2、 效率相比于标记复制算法低一些
— END —
关注公众号 Java岛 ,每天进步亿点点,和小编一起学习Java呀!