垃圾收集算法
收集算法思想: 垃圾收集算法的实现涉及大量的程序细节,仅介绍几种算法的思想以及发展过程。 标记-清除算法 最基础的后手算法,算法可分为标记、清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,标记算法即二次标记过程。 不足之处: ①效率问题,标记和清除两个过程的效率都不高 ②空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作 复制算法 解决标记-清除算法效率问题,讲可用内存划分为内存大小相同的两块,每次只使用其中一块。当一块内存用完时,就将还存活着的对象复制到另外一块上面,然后再把使用过的内存一次性清理。这样使得内存分配实现简单、运行高效,仅需要按顺序分配内存空间即可。 缺点:内存可用空间缩小为原来的一半。 解决方案:将该类算法应用于新生代(新生代对象98%“朝生夕死”),无需按1:1划分,可将新生代内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用一块Eden空间与一块Survivor空间。每当回收时对正在使用的Eden和Survivor空间进行垃圾收集,存活的对象将一次性复制到空闲的另一块Survivor空间(大对象将直接进入老年代)。 担保:10%的内存区域并不是每次都足以容纳继续存活的新生代对象