本文主要介绍Java虚拟机的垃圾回收算法。
一、概述
二、标记-清除算法
Mark-Sweep。如同名字,该算法分两步:
- 标记:标记处需要回收的对象
- 清除:标记完成后统一回收被标记的对象。
缺点:
- 效率问题:标记和清除的效率都不高
- 空间问题:标记清除以后会产生大量不连续的内存碎片
三、复制算法
复制算法是对标记清除的优化,它将堆上的内存分为两个大小相等的区域,一个是空闲区域,一个是活动区域。在程序运行中,实际使用的是活动区域,也就是有50%的空间被浪费掉
实现过程:
- 找出活动空间中所有存活的对象。
- 将这些存活的对象复制到空闲区域。
- 将之前的活动空间清空,然后,就变为空闲空间了,而存活对象所在的区域,则变为活动空间了。
优点,内存回收完毕后,有一大片连续的可用空间。
缺点,有50%的内存空间被放着,只有在发生内存回收的时候,GC才会借用空闲区域来实现内存回收工作。
四、标记-整理算法
标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动,并更新引用其对象的指针。
主要缺点:在标记-清除的基础上还需进行对象的移动,成本相对较高,好处则是不会产生内存碎片。
五、分代收集算法
把java堆分为新生代和老年代:
- 新生带:每次会有大批对象死去,只有少量存活,选用复制算法,只需要对少量存活的对象进行复制,复制成本低。
- 老年代:老年代对象存活率高,使用标记-清理或者标记整理算法进行回收。
时间: 2024-10-23 21:41:09