垃圾回收算法

垃圾回收算法

1引用计数法

思想:

对象A引用了就加1,引用失效了就减1,当引用数为0时,就可以回收

缺点:

1、无法处理循环引用情况(对象A引用对象B,对象B引用对象A,但是A和B都没有别的对象引用)

2、引用计数器要求每次引用产生和消除的时候,都伴随着加法和减法的操作,对系统有一定的影响。

2标记清除算法

标记清除算法是现代回收算法的基础思想,在介绍之前先解释两个名词:

可达对象:通过根对象进行引用搜索,最终可以搜索到的对象

不可达对象:通过根对象进行搜索,最终没有被引用的对象

新生代:存放年轻的对象堆空间,年轻的对象指刚刚创建或者经理回收次数不多的对象

老年代:存放老年的对象的堆空间,老年对象指经历过多次垃圾回收依然存货的对象

思想:

分为两个阶段,标记和清除。标记阶段:标记所有根对象可到达对象,未被标记的对象就是垃圾对象,清除阶段:系统回收不可到达的空间

缺点:

回收后空间是不连续的。当再分配空间时,特别是大对象的时候,不连续的空间要低于连续的空间。

3.复制算法

思想:

将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收的时候,将正在使用的对象复制到未使用的内存中

优点:

如果系统中垃圾对象比较多,需要复制存活的比较少,效率比较高。还有就是复制对象到新的内存空间空间是连续的

在java中新生代串行垃圾回收器中使用这个算法。新生代有分为eden区,from区和to区。其中from和to是两个相同大小的空间。

适用于:

使用在新生代中,因为新生代中垃圾对象通常会多于存活对象

4标记压缩算法

思想:

标记压缩算法,标记也是从根节点开始,对所有的可达对象进行标记。然后把所有存活对象压缩到内存的一段,清理边界外的空间。这样空间是连续的,没有碎片产生。所以看成标记清除算法+空间整理

适用于:

年老代通常使用这种算法,年老代对象大多情况下都是存活对象,如果在使用复制算法,复制成本比较高。

5分代算法

思想:

由于复制,标记压缩,标记清除各有优缺点。根据回收垃圾对象的特性,使用不同的算法这样比较好。基于这种思想,内存空间根据对象的特点分成不通的区间,对应不同的算法。

一般内存分代,分成老年代和年轻代。老年代用于标记压缩算法和标记清除算法,新生代用于复制算法。老年代回收频率比较低,新生代回收频率比较高。

6分区算法

思想:

分代算法是根据对象的存活时间,分区则是把堆空间分成连续不同的小区间,每个区间独立使用,独立回收。

优点

一般来说,堆空间越大一次回收越多,从而产生的停顿越长。可以根据目标的停顿时间,每次回收若干个合理的区间,而不是整个空间。