美文网首页
Java垃圾收集算法

Java垃圾收集算法

作者: _陈陌先生_ | 来源:发表于2016-07-14 21:57 被阅读107次

    当前Java垃圾回收主要有三种算法,然后根据不同情况,对三种算法进行结合,进行分代收集。

    一. 标记-清除算法

    1. 标记-清除(Mark-Sweep)分为两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收被标记的对象。

    2. 它是最基础的算法,后序的算法都是基于该算法改进的。

    3. 有两个不足:第一,标记和清除效率都不高;第二,清除之后会产生大量不连续的内存碎片。

    二. 复制算法

    1. 复制算法Copying,将内存分为大小相同的两块, 每次只使用其中一块,当这一块用完时,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存一次清理掉。

    2. 每次是使用一般的内存,效率不高,但不会有内存碎片。

    3. 改进:因为新生代的对象98%都是朝生夕死,所以不需要按照1:1进行分配。将内存分为一块较大的Eden和两块较小的Survivor空间,每次使用Eden和一块Survivor空间,当回收时将Eden和Survivor中还存活着的对象一次性复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot默认Eden:Survivor=8:1。当Survivor空间不够用时,需要借助老年代进行分配担保。

    三. 标记-整理算法

    1. 复制算法在对象存活率较高时效率会低下。

    2. 根据老年代的特点,标记-整理(Mark-Compact)算法与标记清除的标记过程一样,但在清除阶段是让所有存活对象都移向一端,然后直接清理掉端边界以外的内存。

    四. 分代收集算法

    1. 当前商业虚拟机的垃圾收集都采用分代收集算法,将Java堆分为新生代和老年代,根据每个代的不同,新生代因为每次垃圾收集都会有大量对象死去,所以采用复制算法。老年代存活率较高且没有额外空间进行分配担保,所以使用标记-清除或者标记-整理算法进行垃圾回收。

    相关文章

      网友评论

          本文标题:Java垃圾收集算法

          本文链接:https://www.haomeiwen.com/subject/xcxyjttx.html