您的位置 首页 java

「JVM」垃圾回算法-标记整理算法

标记整理算法 的是 标记清除算法 的基础上有做了‘ 整理 ’阶段的操作。也可以看做是标记清除算法的优化。

标记清除算法与标记整理算法步骤对比:

标记清除 标记-清除

标记整理 标记–整理-清除

有关标记清除算法的思想原理请参阅:

【JVM】垃圾回算法-标记清除算法

在前几篇关于垃圾回收算法中,标记复制算法可以说是似乎很完美了,但在真实情况下,有部分地方的对象回收如果使用标记复制算法还是不行的,比如说老年代中的对象。


标记整理算法背景:

大家都知道,堆中对象的存放位置大致有:新生代、老年代,新生代中的对象可以说是朝生夕灭,因此针对与新生代中的对象而言,使用复制算法可以说很合适了。

但是老年代中的对象经过GC巡逻后大多数仍是存活的,此时对老年代对象使用标记复制算法,之前说的关于标记复制算法的缺点弊端都会显现出来–效率低下(因为需要复制的对象变多了)

「JVM」垃圾回算法-标记整理算法

如果对老年代使用标记清除算法则会有 碎片化空间 效率低下 等缺点,也不适用到老年代。那这不完犊子了么,老年代中的对象该使用那种算法来回收最好呢?

1970年左右,一种新的垃圾回收算法出现了:

标记-整理(压缩)算法(Mark-Compact)


标记整理算法执行步骤:

1、标记存活对象

「JVM」垃圾回算法-标记整理算法

该步骤使用根可打算法标记出存活对象。

2、整理存活对象

「JVM」垃圾回算法-标记整理算法

有序地整理存活对象,在整理的同时,之前对象的在 虚拟机 栈中的引用地址也发生改变。

3、清除非存活对象

「JVM」垃圾回算法-标记整理算法


标记整理算法的优缺点:

优点 (解决别人的缺点就是自己的优点):

1、(相比于标记清除算法) 没有了碎片化内存

2、(相比于标复制算法) 没有了内存减半的消耗

缺点

1、在整理存活对象时,因为对象位置点变动, 还需要该调整虚拟机栈中的引用地址

2、在整理存活对象时, 需要全程暂停用户线程,STW(Stop The World)

2、 效率相比于标记复制算法低一些

— END —

关注公众号 Java岛 ,每天进步亿点点,和小编一起学习Java呀!

文章来源:智云一二三科技

文章标题:「JVM」垃圾回算法-标记整理算法

文章地址:https://www.zhihuclub.com/200519.shtml

关于作者: 智云科技

热门文章

网站地图