1标记清除算法
2复制算法
3标记压缩算法
4分代收集算法
1,标记清除算法
算法分为标记和清除两个阶段,首先标记出要被回收的对象,在标记完成之后,统一回收被标记的对象:这个算法的缺点就是会产生很多不连续的内存碎片和效率不高等问题,如图:
2.复制算法
为了解决效率问题,复制算法出现了,他是将内存分为大小相同的两块,每次只使用其中一块,当一块的内存使完之后,就将他还存活的对象复制给另一块,然后清理使用的这一块,这样,每次回收的就是内存的一半。如图
3.标记整理算法
这个算法是标记清除算法的升级,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一段移动,然后直接清理掉端边界以外的内存。
4.分代收集算法
当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。
比如在新生代中,每次收集都会有大量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。