(35讲)垃圾回收算法——标记清除算法

我们之前已经了解了垃圾回收中如何判定对象是垃圾对象的一些常用的算法,那么,我们找到了要回收的对象之后,我们下一步就要对它进行回收了,从本节课开始,我们来了解一下关于垃圾回收的一些常用的算法,垃圾回收的算法,我们之前也说过了,一般来说有四个,分别是,标记-清除算法复制算法标记-整理算法分代收集算法

我们本节主要来学习第一个,标记-清除算法,这一个算法可以说是以下所有算法的基础,它相对来讲是比较简单的,那么,什么是标记-清除呢?标记-清除算法其实就是有两个过程,第一个过程就是标记第二个过程就是进行清除所谓的标记,就是标记出所需要回收的对象,那么,如何进行标记呢?我们之前已经说过了,就是通过我们之前所讲的那个算法,就是,所谓的可达性分析法以及引用计数法,当然,一般是使用可达性分析法,那么,分析出来了这个对象是一个没有任何引用指向它的对象,那么,这个时候,这个对象就会被标记,标记完了之后,有一个专门的清除程序来进行把这些不用的这些对象就给清除掉了,就这么简单。

虽然它非常简单,其实在这个过程中它是有一些问题的,这里比较明显的就是两个问题,第一个是,标记和清除两个过程,它的执行性能不是特别高,也就是所谓的效率问题,第二个呢,可以先给大家画个图

这是我们的一块内存区域,里面划分了很多的小区域,

然后,我们给它填充一些颜色,

比如说,这些是正在使用的,

这些是标记为可被回收的,还有一些没用的。

当使用标记-清除算法,进行清除之后,这个图会变成什么样子呢?被标记了的,就都被清除了

那,我们发现,这样的话,我们的内存区域会出现越来越多的不连续的空间,那么,这就导致一个问题,当我们在分配一个大对象的时候,这块空间不连续,我们在进行寻址在找的过程中就非常麻烦,影响性能,另外,如果说,实在找不到了,虚拟机会自动再进行触发一次垃圾回收,那么,这个过程也是非常耗性能的,所以,我们说标记-清除算法有两大问题,第一个是效率问题第二个是空间问题。那么,如何解决这两个问题呢?就是我们后面所要认识的这些垃圾回收算法所要完成的任务。

关于标记-清除算法我们就介绍到这里。