常用的垃圾回收算法
1.Mark-Sweep(标记-清除算法)
1.Mark-Sweep(标记-清除算法)
标记-清除算法和它的名字一样,算法分为标记和清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收被标记的对象。
特点:1)标记-清除算法不会进行对象的移动,直接回收不存活的对象,因而会造成内存碎片
:2)虽然内存回收了但是很可能会发生OOM,如上图所示,假设现在要分配10个格子内存,虽然内存回收了,总的可用内存足够大,但是并没有连续的10个格子可用
2.Copying(复制算法)
复制算法,它是将可用内存均分为两块,每次只用其中的一块。当这块内存用完了,就将还存活的对象复制到另一块内存区域,然后把已使用过的内存空间清理掉
特点:1)不用考虑内存碎片情况。复制算法每次都是对某一块内存进行回收,做的是直接清除操作,所以只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。但是复制算法代价是将内存缩小为原来的一半,持续复制长期存活的对象导致效率降低
:2)复制回收算法在对象存活率较高的情况下会执行较多的复制操作,效率因此会降低,更关键的是,如果不想浪费50%的内存空间,就需要有额外的的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况
3.Mark-Compact(标记压缩算法)
特点:1)标记-清除算法不会进行对象的移动,直接回收不存活的对象,因而会造成内存碎片
:2)虽然内存回收了但是很可能会发生OOM,如上图所示,假设现在要分配10个格子内存,虽然内存回收了,总的可用内存足够大,但是并没有连续的10个格子可用
2.Copying(复制算法)
特点:1)不用考虑内存碎片情况。复制算法每次都是对某一块内存进行回收,做的是直接清除操作,所以只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。但是复制算法代价是将内存缩小为原来的一半,持续复制长期存活的对象导致效率降低
:2)复制回收算法在对象存活率较高的情况下会执行较多的复制操作,效率因此会降低,更关键的是,如果不想浪费50%的内存空间,就需要有额外的的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况
3.Mark-Compact(标记压缩算法)