有哪些?
标记-清除算法(MarkSweep)
复制算法(Copying)
标记-整理算法(Mark Compact)
垃圾算法的作用?
当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用空间为新对象分配内存
标记清除算法
世界上第一个GC算法,于1960年由Lisp之父在其论文中发布。
顾名思义,标记—清除分为两个阶段:
标记阶段—先标记出所有需要回收的对象
清除阶段—统一回收所有被标记的对象
标记阶段
标记阶段的主要工作就是利用可达性分析将需要回收的对象标记出来,
从上往下,标记哪些是存活对象,哪些是可回收对象
清除阶段 — 统一回收所有被标记的对象
在清除阶段,GC会遍历整个堆,回收未被标记的对象
从以上2张图,可以看出缺点
- 效率问题,标记和清除的过程效率都不高
- 空间问题,会产生大量的碎片,碎片太多就没有连续的空间分配大对象了,从而不得不提前触发另一次垃圾收集行为。
后续很多垃圾收集算法都是基于此算法的思路进行改进而得到的。
垃圾收集器中的CMS是基于标记—清除算法实现的。