垃圾回收:标记阶段+清除阶段
标记阶段:

由于引用计数算法无法处理循环引用的问题,所以Java的垃圾回收器中没有使用此类算法

在python语言中使用了引用计数算法。


图示;

GCroots可能是哪些元素:


注意其中的小技巧,回收谁,它周边的结构就可以作为GCroots集合内的内容。
补充点:

对象的finalization机制(对象终止机制)

不要主动去调用finalize方法,如果不重写finalize方法,原本的finalize方法中是没有任何内容的。由于finalize方法的存在,对象可能会有三种状态:可触及的、可复活的、不可触及的


finalize方法只能调用一次。
判断一个对象是否可回收的具体步骤:

相当于给一个对象一次重新复活的机会,但机会仅有一次,因为每个对象的finalize方法只能调用一次。
垃圾清除阶段:
常见的算法:标记-清除算法(mark-sweep)、复制算法、标记-压缩算法
标记-清除算法:标记的是可达对象(非垃圾对象)

图示:

标记清除算法的缺点:
注意:清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里,下次有对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放。
复制算法:
核心思想:

图示;

优缺点;

复制算法适用于朝生夕死的场景,所以适用于survivor区。

标记压缩算法(mark-compact):
执行过程;

标记压缩算法与标记清除算法的本质区别是标记压缩算法是一种移动式的回收算法,而标记-清除是一种非移动式的。
优点:
缺点:
对比三种算法:

根据需求,使用分代收集算法:


HotSpot中的CMS回收器:

为了解决STW延迟时间较长的问题,出现了两种新的算法:
增量收集算法:

增量收集算法的缺点:

分区算法:

图解:
