垃圾回收算法
1引用计数法
思想:
对象A引用了就加1,引用失效了就减1,当引用数为0时,就可以回收
缺点:
1、无法处理循环引用情况(对象A引用对象B,对象B引用对象A,但是A和B都没有别的对象引用)
2、引用计数器要求每次引用产生和消除的时候,都伴随着加法和减法的操作,对系统有一定的影响。
2标记清除算法
标记清除算法是现代回收算法的基础思想,在介绍之前先解释两个名词:
可达对象:通过根对象进行引用搜索,最终可以搜索到的对象
不可达对象:通过根对象进行搜索,最终没有被引用的对象
新生代:存放年轻的对象堆空间,年轻的对象指刚刚创建或者经理回收次数不多的对象
老年代:存放老年的对象的堆空间,老年对象指经历过多次垃圾回收依然存货的对象
思想:
分为两个阶段,标记和清除。标记阶段:标记所有根对象可到达对象,未被标记的对象就是垃圾对象,清除阶段:系统回收不可到达的空间
缺点:
回收后空间是不连续的。当再分配空间时,特别是大对象的时候,不连续的空间要低于连续的空间。
3.复制算法
思想:
将原有的内存空间分成两块,每次只使用其中一块,在垃圾回收的时候,将正在使用的对象复制到未使用的内存中
优点:
如果系统中垃圾对象比较多,需要复制存活的比较少,效率比较高。还有就是复制对象到新的内存空间空间是连续的
在java中新生代串行垃圾回收器中使用这个算法。新生代有分为eden区,from区和to区。其中from和to是两个相同大小的空间。
适用于:
使用在新生代中,因为新生代中垃圾对象通常会多于存活对象
4标记压缩算法
思想:
标记压缩算法,标记也是从根节点开始,对所有的可达对象进行标记。然后把所有存活对象压缩到内存的一段,清理边界外的空间。这样空间是连续的,没有碎片产生。所以看成标记清除算法+空间整理
适用于:
年老代通常使用这种算法,年老代对象大多情况下都是存活对象,如果在使用复制算法,复制成本比较高。
5分代算法
思想:
由于复制,标记压缩,标记清除各有优缺点。根据回收垃圾对象的特性,使用不同的算法这样比较好。基于这种思想,内存空间根据对象的特点分成不通的区间,对应不同的算法。
一般内存分代,分成老年代和年轻代。老年代用于标记压缩算法和标记清除算法,新生代用于复制算法。老年代回收频率比较低,新生代回收频率比较高。
6分区算法
思想:
分代算法是根据对象的存活时间,分区则是把堆空间分成连续不同的小区间,每个区间独立使用,独立回收。
优点
一般来说,堆空间越大一次回收越多,从而产生的停顿越长。可以根据目标的停顿时间,每次回收若干个合理的区间,而不是整个空间。