文章目录
- 前言
- 一、标记清除算法(Mark Sweep)
- 二、标记整理算法(Mark Compact)
- 三、复制算法(Copy)
前言
标记出垃圾对象之后,就要进行清理。
那么,如何清理?
这里也有相应的算法。
主要有三种。
一、标记清除算法(Mark Sweep)
原理说明:如上图,在JVM
内存空间中,根据可达性分析算法,标记出没有被引用的对象为垃圾对象,等待GC
回收。那么,清除阶段,直接记录出垃圾对象的起始坐标和结束坐标。那么,这段坐标内,即为可用内存。所以,清除速度快
。
缺点:造成空间碎片,使得较大对象无法存入,浪费了碎片空间。
二、标记整理算法(Mark Compact)
原理说明:这个算法,其实是在标记清除算法的基础上的一个优化。标记清除算法存在的缺点就是,空间碎片问题,所以,这里在清除垃圾对象的同时,进行存活对象的移动,把对象存放到一个连续的空间中,从而,是可用空间保持连续。解决了空间碎片问题。
缺点:因为,存活对象的移动,一定会涉及到复制工作,并且,移动后的对象,内存地址也会发生改变。从而导致,原始引用需要修改对象地址。从而造成效率低下。
三、复制算法(Copy)
原理说明:内存分为FROM
和TO
两块区域,GC
发生时,会将FROM
中的存活对象复制到TO
区域,再将FROM
中的垃圾对象清除掉。然后,将原来的TO
区域标记为FROM
区域,原来的FROM
区域标记为TO
区域。没有内存碎片。
缺点:空间利用率较低。