深入理解JVM(五)——垃圾收集算法

1.标记-清除算法

2.复制算法

3.标记-整理算法

4.分代收集算法

1.标记-清除算法
最简单的还是标记-清除算法,它的做法是首先根据可达性分析算法,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
如图所示:
深入理解JVM(五)——垃圾收集算法_第1张图片

我们可以看出,在收集完垃圾之后,内存会产生大量不连续的碎片,以后分配对象时,可能会造成内存不足。

优点:实现简单。
缺点:
效率问题:标记和清除两项效率都不高
空间问题:标记清除后会产生大量不连续的内存碎片,以后分配较大对象时,可能会导致无法得到连续内存而出发另一次垃圾收集操作。

2.复制算法
复制算法的特点是。我们先将内存容量按同等大小划分成两块,每次只使用其中的一块,当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已经使用过的内存空间一次性清理掉。

深入理解JVM(五)——垃圾收集算法_第2张图片

优点:不会产生内存碎片。
缺点:
可用空间会下降至原来的一半。

我们之前讲解GC过程的时候,出现了两个survivor区域,用的就是这个算法。
深入理解JVM(三)——堆的结构,GC过程以及调优参数简介

3.标记-整理算法
我们先标记要回收的对象,然后将存活的对象往一端移动,最后直接清理掉端边界以外的内存。

深入理解JVM(五)——垃圾收集算法_第3张图片

优点:解决内存碎片问题。

缺点:整理阶段,由于移动了可用对象,需要去更新引用。

4.分代收集算法

当前虚拟机都采用这种算法,根据对象存活的周期把不同的内存划分成几块,然后采用各个年代最适合的收集算法。
新生代中,每次都有大量对象死去,就采用复制算法。
老年代中存活率高,没有额外空间进行分配担保,就是用标记-整理,或者标记-清理算法进行回收。

今天我们介绍了几种垃圾回收算法,以及他们的优缺点。

你可能感兴趣的:(javajvm垃圾收集)