目录
目录
总结
总述
JVM 之所以能够实现垃圾收集,是因为它在运行时会对内存中的对象进行管理和维护。JVM 中的垃圾收集器会定期扫描内存中的对象,将不再被使用的对象标记为垃圾,并将其回收。这样可以避免程序运行时出现内存泄漏等问题。
垃圾收集算法
首先我们要先知道一般的垃圾收集算法的大致过程:垃圾收集器会定期检查存放对象的内存区域。当检查到不再使用的对象后,垃圾收集器会把这个对象进行回收。当然,这个过程还可以继续细分,可以分为标记-回收两个阶段,垃圾收集器遍历内存中的对象,把正在使用的对象进行标记,跳过没有正在使用的对象,这就是标记阶段;而在回收阶段,垃圾收集器会再次遍历所有的对象,随后识别出标记的对象和未被标记的对象,回收那些未被标记的对象。
标记-清除算法
标记-清除算法的核心思想就是两个字:标记和清除,即先标记,再清除。标记阶段标记所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。该算法最大的问题就是内存碎片严重化,后续可能发生对象不能找到利用空间的问题。
在内存中,基于标记-清除算法,空间分为三种状态:存活对象、可回收对象、未使用空间。经过标记-清除算法后,显而易见,对于可回收对象所在的空间,将会被清理,变为未使用空间。这就是标记-清除算法实现的效果。
标记-复制算法
前面我们已经知道标记-清除算法的基本过程,这个过程看起来非常直观准确,但也存在效率不高的问题,基于此,1969年Fenichel提出了一种可以称为“半区复制”的方法。
核心思想就是先把内存区域分为数量相等的两个区域,一个区域1存放正在使用的对象,已经被标记的对象,以及未使用空间,而另一个区域2的空间全部都是未使用空间,当开始进行垃圾收集时,将未被清除的对象清除,仍然存活的对象移动到区域2。
可以看到,这种算法相对于标记-清除算法,这种算法每次处理的都是二分之一的内存空间,好处是对于可回收对象并不太多的情形,这种算法每次处理的工作量不大,而且每次仅遍历一半空间,节省了很多资源。但这种算法虽然善于处理少量的可回收对象,但是因为首先就把内存空间划分了一半,这样会造成内存空间的利用率不高,而且如果遇到可回收对象占比空间比较大的情况,这种算法自身的优势也就不存在了。
标记-整理算法
![](https://img-blog.csdnimg.cn/98c9d9e870714560aa0fa7294f105095.png)