1.标记-清除算法
2.复制算法
3.标记-整理算法
4.分代收集算法
1.标记-清除算法
最简单的还是标记-清除算法,它的做法是首先根据可达性分析算法,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
如图所示:
我们可以看出,在收集完垃圾之后,内存会产生大量不连续的碎片,以后分配对象时,可能会造成内存不足。
优点:实现简单。
缺点:
效率问题:标记和清除两项效率都不高
空间问题:标记清除后会产生大量不连续的内存碎片,以后分配较大对象时,可能会导致无法得到连续内存而出发另一次垃圾收集操作。
2.复制算法
复制算法的特点是。我们先将内存容量按同等大小划分成两块,每次只使用其中的一块,当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已经使用过的内存空间一次性清理掉。
优点:不会产生内存碎片。
缺点:
可用空间会下降至原来的一半。
我们之前讲解GC过程的时候,出现了两个survivor区域,用的就是这个算法。
深入理解JVM(三)——堆的结构,GC过程以及调优参数简介
3.标记-整理算法
我们先标记要回收的对象,然后将存活的对象往一端移动,最后直接清理掉端边界以外的内存。
优点:解决内存碎片问题。
缺点:整理阶段,由于移动了可用对象,需要去更新引用。
4.分代收集算法
当前虚拟机都采用这种算法,根据对象存活的周期把不同的内存划分成几块,然后采用各个年代最适合的收集算法。
新生代中,每次都有大量对象死去,就采用复制算法。
老年代中存活率高,没有额外空间进行分配担保,就是用标记-整理,或者标记-清理算法进行回收。
今天我们介绍了几种垃圾回收算法,以及他们的优缺点。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。