公众号做微网站小程序排行榜
文章目录
- 前言
 - 一、标记清除算法(Mark Sweep)
 - 二、标记整理算法(Mark Compact)
 - 三、复制算法(Copy)
 
前言
标记出垃圾对象之后,就要进行清理。
 那么,如何清理?
这里也有相应的算法。
 主要有三种。
一、标记清除算法(Mark Sweep)

 原理说明:如上图,在JVM内存空间中,根据可达性分析算法,标记出没有被引用的对象为垃圾对象,等待GC回收。那么,清除阶段,直接记录出垃圾对象的起始坐标和结束坐标。那么,这段坐标内,即为可用内存。所以,清除速度快。
缺点:造成空间碎片,使得较大对象无法存入,浪费了碎片空间。
二、标记整理算法(Mark Compact)

 原理说明:这个算法,其实是在标记清除算法的基础上的一个优化。标记清除算法存在的缺点就是,空间碎片问题,所以,这里在清除垃圾对象的同时,进行存活对象的移动,把对象存放到一个连续的空间中,从而,是可用空间保持连续。解决了空间碎片问题。
缺点:因为,存活对象的移动,一定会涉及到复制工作,并且,移动后的对象,内存地址也会发生改变。从而导致,原始引用需要修改对象地址。从而造成效率低下。
三、复制算法(Copy)



 原理说明:内存分为FROM和TO两块区域,GC发生时,会将FROM中的存活对象复制到TO区域,再将FROM中的垃圾对象清除掉。然后,将原来的TO区域标记为FROM区域,原来的FROM区域标记为TO区域。没有内存碎片。
缺点:空间利用率较低。
