目录
标记-清除算法
分为标记阶段和清除阶段
标记阶段
遍历所有的 GCRoots 标记所有存活对象
清除阶段
清除所有未被标记的对象,清除后内存不连续,产生内存碎片,需要维护空闲列表,在分配大对象或者大数组对象时,可能没有连续的内存空间进行存放
复制算法
将内存分为两块,同一时刻只使用其中的一块内存,垃圾收集时,将存活对象复制到另一块区域,然后将垃圾对象统一清理。会浪费一部分内存,适用于对象存活率较低的场景
标记-整理算法
分为标记阶段和整理阶段
标记阶段
同样的,遍历所有 GCRoots 标记所有存活对象
整理阶段
把存活对象移动到内存的一端,然后对存活对象边界之外的内存进行统一回收。适用于垃圾收集次数不频繁,对象存活率较高的场景