《深入理解java虚拟机》学习笔记04-垃圾收集算法

来源:互联网 发布:淘宝查排名软件 编辑:程序博客网 时间:2024/05/20 03:38

 垃圾收集算法

 1、标记-清楚算法

 (1)是最基础的算法,之所以这么说是因为后续的收集算法都是基于他的不足进行改进而得到的。

 (2)该算法分为“标记”和“清除”两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

 (3)不足主要有两个:

    a、效率问题,两个过程效率都不高。

    b、空间问题,该算法会产生大量的不连续的空间碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时。无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作

2、复制算法

(1)解决了之前算法的效率问题。但是在进一步消耗空间的前提下。

(2)该算法原理:将可用内存按容量大小分为大小相等的两块,每次只使用其中的一块。如果其中一块内存用完了,就将还存在的对象复制到另外一块上面,然后再把已使用过的空间一次性清除。、

(3)现在商业虚拟机都是采用这种来回收新生代。

    新生代中98%的对象都是朝生夕死,所以不需要按照1:1的比例来划分,而是将内存划分为一块较大的Eden和两块较小的Survivor,每次使用Eden和一块Survivor。当回收时,将Eden和Survivor中还存活的对象一次性的复制进入另一块Survivor中,最后清除点使用过的Eden和Survivor空间。

   

    HotSpot虚拟机默认Eden和Survivor的比例是8:1,也就是说只有10%的内存会被浪费。如果10%不够用时,即另一块Survivor空间没有足够空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。

   

    缺点:对象存活率很高时要进行较多的复制操作,效率会变低。更重要的是如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,老年代中不适合该算法。

3、标记-整理算法

该算法过程:标记过程和标记-清除算法一样,当是后续步骤不直接回收对象,而是将所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

4、分代收集算法

一般把java堆分成新生代和老年代。

在新生代中,每次垃圾收集时都有大批对象死亡,所以就选择复制算法。

在老年代中对象的存活率很高,就必须使用"标记-清理"或者”标记-整理“算法

阅读全文
0 0
原创粉丝点击