垃圾回收算法 - morris131/morris-book GitHub Wiki

垃圾回收算法

标记-整理算法

image

标记清除法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段,清除所有未被标记的对象。

标记清除算法可能产生的最大的问题就是空间碎片。

复制算法

image

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

复制算法适用于垃圾对象较多的场景,没有碎片空间。但是复制算法的代价是将系统内存空间折半,只使用一半空间,而且如果内存空间中垃圾对象少的话,复制对象也是很耗时的,

新生代采用复制算法。

image

新生代分为一块较大的Eden空间和两块较小的survivor空间,当回收时,将Eden空间和其中一块Survivor空间中存活的对象复制到另一块Survivor,最后清理掉Eden空间和刚刚使用过的Survivor空间。

标记-整理算法

image

标记-整理算法在标记-清除算法的基础上做了优化。首先从根节点开始,对所有可达的对象做一次标记,然后将所有的存活对象压缩到内存空间的一端,最后清理边界外所有的空间。这样做避免的碎片的产生,又不需要两块相同的内存空间,因此性价比高。

分代算法

分代算法将内存空间根据对象的特点不同进行划分,选择合适的垃圾回收算法,以提高垃圾回收的效率。

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

老年代的存活率是很高的,如果依然使用复制算法回收老年代,将需要复制大量的对象。这种做法是不可取的,根据分代的思想,对老年代的回收使用标记清除或者标记压缩算法可以提高垃圾回收效率。

⚠️ **GitHub.com Fallback** ⚠️