垃圾收集算法对比

来源:互联网 发布:最强nba球员数据对比 编辑:程序博客网 时间:2024/05/16 19:49

垃圾收集算法

1. 标记-清理算法

      标记清理算法是垃圾收集算法中最基础的算法,其他算法都是在他的基础上优化得到的,垃圾收集算法主要分为标记和清除两个阶段,标记即标记中需要回收的对象,标记完成之后对标记的对象做清理操作。该算法有两个不足点:1. 效率不高,标记和清理两个过程的效率都不高; 2. 空间问题,标记清理之后会产生大量的空间碎片,如果需要分配一个连续空间存储大对象,则会提前触发垃圾的回收。

2. 复制算法

      为了解决效率标记-清除算法中的效率问题,复制算法随之产生,复制算法是将内存空间分为两块,当其中一块内存用完之后,将存活的对象复制到另一块内存区域中。接着将使用过的内存空间一次清理掉,这样使得每一次都对一半的内存区域进行回收,不需要考虑内存中的碎片问题。但是他会造成内存空间的浪费,这种算法只有一半的内存空间是可用的。
      商业虚拟机一般采用这种算法来回收年轻代,据统计,年轻代的空间回收率大概在98%左右,大部分对象都是处于“朝生暮死”的状态。因此不需要按照1:1的比例来分配内存空间。而是将内存分为一块较大的Eden区和两个较小的Survivor区,每次都是用Eden区和其中的一块Survivor区,当进行对象回收时,将Eden和Survivor区存活的对象都复制到另一块Survivor区中。最后清理刚刚使用的Eden和Survivor区的所有内存空间。HotSpot虚拟机默认是8:1的比例。这样损失的内存即为年轻代内存的1/10。如果Survivor区没有足够的内存存储存活的对象的话,需要有一块内存区域做“担保”。这块内存区域便是老年代。

3. 标记整理算法

      复制收集算法在存活率较高的时候,需要做大量的复制,效率会变低,并且如果不想浪费50%空间的话,就必须要有担保以避免被使用的内存中所有的对象100%存活,所以老年代一般不使用这种方法。
      标记整理算法是:标记过程和标记-清理算法一样,当时后续并不是对回收的对象进行处理,而是将存活的对象向内存的一端移动,然后清理掉另一端的所有内存。

4. 分代收集算法

      当前商用虚拟机的垃圾收集都采用“分代收集”算法,这中算法是根据存活周期的不同将内存分为几块。HotSpot虚拟机将内存分为新生代和老年代,新生代的对象存活率比较低,采用复制算法,并且有老年代做担保,而老年代的对象存活率高,并且没有额外的空间做担保,所以一般采用“标记-清除”算法或“标记-整理”算法进行回收。