一、标记-清除算法
- 最基础的收集算法,其余的算法基本都是由此算法改进得来
- 效率不高,标记和清除的过程效率都不高
- 清除之后会产生大量的不连续的内存碎片
二、复制算法
- 为了解决标记-清除算法的效率问题而出现的复制算法
- 将内存分为两块,一个半区用于放对象,另一个半区是空的
- 垃圾回收时将放置对象的半区中未被标记死亡的对象放到空半区
- 这样的好处在于实现简单,运行高效
- 缺点是牺牲了一般的内存空间,代价太大
三、现在的复制算法
- HotSpot虚拟机采用Eden-Survivor分区的方式
- 将内存分为Eden空间和两块Survivor空间,大小为8 : 1 : 1
- 回收时将Eden空间和一块Survivor空间中还存活的对象复制到另一个Survivor空间中
- 这样做的原因是因为:98%的新生代都是“朝生夕死”的,所以每次回收的时候可以将存活的对象放到较小的一块区域
- 当另一块Survivor空间没有大小不够时,虚拟机会通过分配担保机制将这些对象划进老年代
四、标记-整理算法
- 在老年代中一般都是存活时间比较长的对象,所以不适合使用复制算法进行回收(基本不会“朝生夕死”)
- 标记-整理算法会将所有存活的的对象都像一端移动,然后清理掉边界以外的内存
五、分代回收算法
- 当前商业虚拟机的垃圾收集都采用分代回收算法
- 将内存划分为几块,一般是把java堆分成新生代和老年代,根据各个年龄代的特点,选择不同的算法进行回收
- 新生代一般是“朝生夕死”,所以采用复制算法,高效且不需要很大的空闲内存
- 老年代的对象存活率高,所以使用标记-清除算法或者标记-整理算法