常见的垃圾回收算法
1、引用算法(Reference Counting)
在对象头处维护一个counter,每增加一次对该对象的引用计数器自加,如果对该对象的引用失联,则计数器自减。当counter为0时,表明该对象已经被废弃,不处于存活状态。这种方式一方面无法区分软、虛、弱、强引用类别。另一方面,会造成死锁,假设两个对象相互引用始终无法释放counter,永远不能GC。此算法最致命的是无法处理循环引用的问题。
2、复制算法(Copying)
将原有的内存空间分为两块,每次只使用其中的一块,在垃圾回收时候,将正在使用的内存中的存活对象复制到为未使用的内存中,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。此算法每次只处理正在使用中的对象,因此复制成本较小,同时复制过去以后还能进行相应的内存整理,不会出现 “ 碎片 ” 问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

标记 - 清除 (Mark - Sweep)
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段便利整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

标记 - 整理(Mark - Compact)
此算法结合了 “标记 - 清除” 和 “复制” 两个算法的优点。也是分为两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段便利整个堆,把清除未标记对象并且把存活对象 “压缩” 到堆的其中一块,按顺序排放。此算法避免了 “标记 - 清除” 的碎片问题, 同时也避免了 “复制” 算法的空间问题。

网友评论