龙空技术网

「JVM」垃圾回算法-标记清除算法

统计学毕业的程序员 304

前言:

当前各位老铁们对“标记清楚算法”可能比较注重,朋友们都需要了解一些“标记清楚算法”的相关知识。那么小编在网络上搜集了一些有关“标记清楚算法””的相关内容,希望各位老铁们能喜欢,看官们快快来学习一下吧!

判断对象是否可被回收:

「JVM」判断对象是否该被回收-引用计数法

「JVM」垃圾回收-判断对象是否该被回收-可达性分析法

如何回收?回收算法-标记清除算法:

标记清除(Mark-Sweep)算法的整个过程就像其名称一样分为两步:标记(Mark)和 清除(Sweep)。

标记过程:标记过程其实就是判定对象是否是可被回收对象,这步的常见的算法前面已经学习过了,只不过在Java中,最常用的是:根可达性分析算法。

那么问题来了,标记那种对象呢?究竟是标记可回收对象呢?还是不可回收对象?其实标记那个都可以,对于垃圾回收来说,对象的角色无非就两种:

可回收的、不可回收的。

标记可回收的,那就清理可回收对象

标记不可回收,那就清理可回收对象

根据需求二选一即可,具体标记那个,清除那个就要看算法的实现了。

清除过程:清除过程就很好理解了,直接释放掉可回收对象占用的堆空间即可。

这就说完了?不,标记清除算法是最早出现,同时也是思想最简单的垃圾回收算法。既然是最早出现的一类回收算法,现如今又有其他很多的回收算法,那么标记清除算法肯定有其弊端,下面谈论下缺点

主要缺点:

1、空间问题:由于对象与对象之间在堆内存中分配的物理内存不是连续的,经过一次标记与清除之后,很大几率上会出现下图堆内存对象布局

清除后的堆内存由于空间不连续,即内存碎片化,若下一次需要分配对象的内存大于碎片空间,这样会提前触发GC,当提前触发的GC回收后,空间还是不足就会出现OOM等错误(本来堆内剩余空间是足够的,由于碎片化导致空闲内存比较分散)。

2、时间问题:由于分为两个过程(标记、清除),当堆内可回收对象较多时,该算法需要进行大量的标记与清除,这里就产生一个问题,随着可回收对象的的增多,标记和清除的效率就会下降;再者由于空间不连续导致每次再次分配都要遍历空闲列表

3、在标记和清理阶段,都要遍历整个堆,SWT(Stop The World)时间长。

--- END ---

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

标签: #标记清楚算法 #标记清除算法 #标记清除算法效率