分代收集理论
当前虚拟机的垃圾收集都采用分代收集理论,根据对象存活时间不同将内存分为几块。Java推分为新生代和老年代,我们根据各个年龄代不同的特性选择合适的垃圾收集算法。在新生代,每次收集都会有大量的对象(99%)死亡,可以选择复制算法,只需要付出少量对象的复制成本就可以完成垃圾收集。老年代存活率比较高,而且没有额外的空间对它进行分配担保,所以我们必须选择标记-清除或者标记-整理算法。标记清除和标记整理算会会比复制算法慢10倍以上。
垃圾收集算法
复制算法
复制算法将内存分为大小相同的两块,每次只使用其中一块。当其中一块使用完时,就将存活的对象复制到另一块上,然后把这块空间清理干净。每次回收都是对内存空间的一半进行回收。
优点
- 收集后无内存碎片
缺点
- 浪费一半内存空间
标记-清除算法
标记-清除算法分为标记、清除两个阶段,先标记存活的对象,再统一回收未被标记的对象(通常情况),也可以标记需要回收的对象,标记完后统一回收标记过的对象。
优点
- 算法简单,相对标记整理快
缺点
- 如果需要标记的对象太多,效率不高
- 清除后产生大量不连续内存碎片
标记-整理算法
标记-整理算法在标记这个阶段,与标记-清除算法一致,但后续并不是直接回收垃圾对象,而是将存活对象对象挪到一端,剩下的空间清理掉。
优点
- 无碎片产生
缺点
- 因为要移动对象,相对标记-清除算法会慢