这是我参与更文挑战的第5天,活动详情查看: 更文挑战
学习了常用的几种垃圾回收算法,这边做下笔记
1.标记-清除算法
该算法分为标记和清除两个阶段,先对不需要回收的空间进行标记,标记结束后对没有做标记的部分统一回收。它是最基础的回收算法,后续的算法都是对其改进得到的。
问题
- 空间浪费(标记清除后会产生大量的不连续的空间碎片)
- 效率问题
2.复制算法
将内存分为大小相同的两块,每次只使用其中的一块,当一次垃圾回收结束后就把存活的对象复制到另一块上,然后把使用的空间清理掉,这样重复进行。
3.标记整理算法
根据⽼年代的特点提出的⼀种标记算法,标记过程仍然与“标记-清除”算法⼀样,但后续步骤不是直接对可回收对象回收,⽽是让所有存活的对象向⼀端移动,然后直接清理掉端边界以外的内存
4.分代收集算法
当前虚拟机的垃圾收集都采⽤分代收集算法,这种算法实际上是根据对象存活周期的不同将内存分为⼏块。⼀般将 Java 堆分为新⽣代和⽼年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。⽐如在新⽣代中,每次收集都会有⼤量对象死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。⽽⽼年代的对象存活⼏率是⽐较⾼的,⽽且没有额外的空间对它进⾏分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进⾏垃圾收集。