
由于垃圾回收算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此不进行过多讨论算法的实现了,只记录和学习!
算法1、标记-清除算法
最基础的收集算法是“标记-清除”算法,此算法分为“标记”和“清除”两个阶段。
它的主要不足有两点:
不足一:效率问题,标记和清除两个过程的效率都不高。
不足二:空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后程序运行过程中需要分配较大对象时,无法找到足够且连续内存,从而不得不触发一次垃圾回收的动作。

算法2、复制算法
将可用内存分成大小相同的两块,每次只用其中一块。当一块内存用完,就将还存活的对象复制到另外一块上,然后再把已经使用过的内存空间一次清理掉。
-
优点:
这样每次只针对整个半区进行内存回收,内存分配时也无需考量内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。 -
缺点:
这种算法的代价是将内存缩小了一半,代价略高。如果程序对象存活率较高,就会进行较多的复制操作,效率会降低
复制算法
算法3、标记整理算法
让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
-
优点:
适用于老年代的算法,不会产生大量不连续的内存碎片,且用于完整的内存块 -
缺点:
不适用于新生代,新生代对象存活率太低,此法会增加效率计算负担
标记整理算法
算法4、分代收集算法
当前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般情况是把Java堆分为“新生代”和“老年代”,这样可以根据年代特点采用最实用的算法。
- 1、在新生代中,每次垃圾回收都会有大批对象死去,只有少量存活,就选用“复制算法”,只需要复制少量存活对象的成本就可以完成回收。
- 2、在老年代中,对象的存活率较高,没有额外空间对它进行分配担保,就必须使用“标记-清除”或“标记-整理”算法进行回收。
网友评论