自己理解的gc算法

1、引用计数法

      为每一个对象配备一个整型计数器。对于一个A对象,只要有任何一个对象引用了A,则A的引用计算器就加1,当引用失效时,引用计数器减1.只要A的引用计数器值为0,则对象A就不可能再被使用。           

        缺点:1)无法解决循环引用问题  2)计数器加减操作影响性能


2、标记清除法

        通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象然后在清除阶段,清除所有未被标记的对象。

        缺点:存在碎片,回收后的内存空间不再连续在对象的对空间分配过程中,尤其是大对象的内存分配,不连续内存空间的工作效率要低于连续空间的


3、复制算法

        将原有的内存空间分为两块相同的存储空间,每次只使用一块,在垃圾回收时,将正在使用的内存块中存活对象复制到未使用的那一块内存空间中,之后清除正在使用的内存块中的所有对象,完成垃圾回收。

        优点:对象多时,效率高,不存在碎片

        缺点:1)对象少时复制耗时不可取  2)存储空间折半


4、标记压缩算法

        和标记清除算法一样,标记压缩算法也首先从根节点开始,对所有可达的对象做一次标记,但之后,它并不是简单的清理未标记的对象,而是将所有的存活对象压缩到内存空间的一端,之后,清理边界外所有的空间这样做避免的碎片的产生,又不需要两块相同的内存空间,因此性价比高。

        前提:对象比较少时        适用:老年代 

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

        老年代对象:存放老年对象的堆空间。即为经历多次垃圾回收依然存活的对象。


5、分代算法

        新生代对象朝生夕灭,大约90%的对象会很快回收,因此,新生代比较适合使用复制算法

        老年代的存活率是很高的,使用标记清除或者标记压缩算法可以提高垃圾回收效率。

        分代的思想被现有的虚拟机广泛使用

        为了支持高频率的新生代回收,虚拟机可能使用一种叫做卡表的数据结构,卡表为一个比特位集合,每一个比特位可以用来表示老年代的某一区域中的所有对象是否持有新生代对象的引用,卡表中每一位表示老年代4KB的空间,卡表记录为0的老年代区域没有任何对象指向新生代,只有卡表为1的区域才有对象包含新生代对象的引用,因此在新生代GC时,只需要扫面卡表为1所在的老年代空间,使用这种方式,可以大大加快新生代的回收速度。


6、分区算法

         分区算法将整个堆空间划分为连续的不同小区间,

        堆空间越大,一次GC所需的时间就越长,从而产生的停顿时间就越长。为了更好的控制GC产生的停顿时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理的回收若干个小区间,而不是整个堆空间,从而减少一个GC的停顿时间。





猜你喜欢

转载自blog.csdn.net/dfhdfdjfkb/article/details/79404649