垃圾是指死掉的对象,其回收涉及回收算法和回收器。这篇文章只谈论垃圾回收算法。
1、标记-清除算法(Mark-Sweep)
分成两个步骤:标记和清楚。这是最基本的算法,其他算法都是对它的改进。
这个算法简单易行,但有两个缺点:
a)效率问题:两个步骤效率都不高
b)空间问题:GC之后会产生大量不连续的内存碎片,如果分配较大的对象,就会无法找到足够多的内存而不得不提前触发另一次GC。可见连续内存不足也是触发GC的一个原因。
2、复制算法(Copying)
将内存一分为二,每次只使用其中一块,当这块内存用完了,就把内存中存活的对象复制到另一块中,然后清除这一块内存。
这种算法简单易行,消除了内存碎片(解决了MS算法的碎片问题),但缺点是内存利用率太低。而且当存活对象较多时,会产生大量的复制操作。
3、标记-整理算法(Mark-Compact)
为了解决复制算法内存利用率低的问题,有人提出标记整理算法。这种算法与标记清除算法类似,不同之处是将存活的对象移到内存的另一边,然后清除边界之外的内存。
4、分代收集算法
根据对象的生存周期,将内存分为不同的区域,其实就是将堆分成新生代和老年代。
新生代中的对象朝生夕死,存活率低,适用于复制算法。而老年代中的对象存活率较高,适用于MS或MC算法。
2017-12-29阅:
本文介绍了四种算法,现在看其关系。
改进关系:往往是对最基础算法的改进(比如MS),可知好的算法不是一步到位,而是逐渐优化而来。
互补关系:每种算法必有长处和短处,而且这些长处和短处可以互补。
组合关系:一个集大成的算法并非凭空创新,往往是对基础算法的整合。