JVM垃圾回收算法

垃圾是指死掉的对象,其回收涉及回收算法和回收器。这篇文章只谈论垃圾回收算法。

1、标记-清除算法(Mark-Sweep)


分成两个步骤:标记和清楚。这是最基本的算法,其他算法都是对它的改进。

这个算法简单易行,但有两个缺点:

a)效率问题:两个步骤效率都不高

b)空间问题:GC之后会产生大量不连续的内存碎片,如果分配较大的对象,就会无法找到足够多的内存而不得不提前触发另一次GC。可见连续内存不足也是触发GC的一个原因。

2、复制算法(Copying)



将内存一分为二,每次只使用其中一块,当这块内存用完了,就把内存中存活的对象复制到另一块中,然后清除这一块内存。

这种算法简单易行,消除了内存碎片(解决了MS算法的碎片问题),但缺点是内存利用率太低。而且当存活对象较多时,会产生大量的复制操作。

3、标记-整理算法(Mark-Compact)


为了解决复制算法内存利用率低的问题,有人提出标记整理算法。这种算法与标记清除算法类似,不同之处是将存活的对象移到内存的另一边,然后清除边界之外的内存。

4、分代收集算法

根据对象的生存周期,将内存分为不同的区域,其实就是将堆分成新生代和老年代。

新生代中的对象朝生夕死,存活率低,适用于复制算法。而老年代中的对象存活率较高,适用于MS或MC算法。

2017-12-29阅:

本文介绍了四种算法,现在看其关系。

改进关系:往往是对最基础算法的改进(比如MS),可知好的算法不是一步到位,而是逐渐优化而来。
互补关系:每种算法必有长处和短处,而且这些长处和短处可以互补。
组合关系:一个集大成的算法并非凭空创新,往往是对基础算法的整合。

你可能感兴趣的:(JVM垃圾回收算法)