常用垃圾回收算法:
标记清除、复制、标记整理和分代收集,这里只介绍前面三种,分代收集单独有一篇文章介绍
标记清除就是回收垃圾对象
标记复制就是将存活对象移到了另一个区域
标记整理就是将存活对象移到一端
标记整理就是
1.标记清除算法: 标记哪些对象要清除,然后清除这些被标记的对象
由于标记清除算法在清理对象所占用的内存空间后并没有重新整理可用的内存空间,因此如果内存中可被回收的小对象居多,则会引起内存碎片化的问题,继而引起大对象无法获得连续可用空间的问题。(即会有很多小碎片)
2.标记复制算法:
复制存活对象到另一个区域中去,将原区域的对象全部回收,直接清理掉原区域
注意这里是复制,而不是直接移动,下面的标记整理才是直接将存活的对象移动
首先将可用内存划分为两块大小相等的内存区域,即区域1和区域2,新生成的对象都被存放在区域1中,在区域1内的对象存储满后会对区域1进行一次标记,并将标记后仍然存活的对象全部复制到区域2中,这时区域1将不存在任何存活的对象,直接清理整个区域1的内存即可
下面展示了对Young新生代对象进行回收的时候采用了标记复制法,先把伊甸区和SurvivorFrom区中幸存的对象复制到SurvivorTo区,然后清空伊甸区和SurvivorFrom
复制算法的内存清理效率高且易于实现,但由于同一时刻只有一个内存区域可用,即可用的内存空间被压缩到原来的一半,因此存在大量的内存浪费。同时,在系统中有大量长时间存活的对象时,这些对象将在内存区域1和内存区域2之间来回复制而影响系统的运行效率。因此,该算法只在对象为“朝生夕死”状态时运行效率较高。
3.标记整理算法
先将所有的存活对象移动到一端,然后清理掉存活对象边界以外的区域的数据
对存活对象进行移动,效率很低