判断对象是否可被回收:

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

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

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

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

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

Java标记废弃枚举元素注解 jvm标记清除算法_垃圾回收

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

可回收的、不可回收的。

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

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

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


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


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

主要缺点:

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

Java标记废弃枚举元素注解 jvm标记清除算法_垃圾回收_02

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

Java标记废弃枚举元素注解 jvm标记清除算法_标记清除_03

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

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

--- END ---