Java垃圾收集算法

来源:互联网 发布:我的心时刻牵挂着网络 编辑:程序博客网 时间:2024/05/01 14:35

        标记-清除算法

        算法分为”标记“和”清除“两个阶段。首先标记处所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象,标记过程通过为上一篇中描述的根搜索算法完成。(后续的收集算法都是基于这种算法改进而来)

        主要缺陷:1. 效率问题,标记和清除过程效率都不高。

        2. 空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致之后程序分配大对象时无法找到足够空间的内存,从而提前触发下一次垃圾收集。 



          复制算法

          复制算法改进了”标记-清除算法“中的效率问题,它可将内存按容量划分为大小相等的两块,每次只是用其中的一块。而当这一块用完了,就将还存活着的对象复制到另一块去,然后将这一块的内存空间完全清除掉。这种算法的代价是将内存缩小为原来的一般,代价太高了点。


        现在商业虚拟机中都采用这种回收算法来收集新生代。基于新生代对象的生命周期短暂,并不需要按1:1来划分内存空间,而是将内存划分为一块较大的Eden空间和两块较小的Survivor空间。每次使用Eden和其中的一块Survivor,回收时,将Eden和Survivor中还存活着的对象一次性拷贝到另一块Survivor中,最后清理掉Eden和使用过的Survivor的空间。

        复制收集算法在存活率较高时要执行较多的复制操作,效率会降低。


        标记-整理算法

        让所有存活的对象都向一端移,然后直接清理掉边界以外的对象。示意图:

  


            分代收集算法

            根据对象的存活周期不同,将内存划分为几块。一般是将Java堆分为新生代和老生代,这样就可以根据各个年龄的特点采用最合适的收集算法。



0 0
原创粉丝点击