垃圾收集针对的是堆内存中的对象
最简单的是——引用计数(Reference Counting)
对每个对象保存一个引用计数,当计数为零时边删除这个对象。缺点是新对象生成需要更新相关计数,且无法删除循环引用。
常用垃圾收集算法:
标记——清除(Mark—Sweep)算法
首先标记出存活的对象,没有被标记出来的便被收集
第一阶段:从引用根节点开始标记所有被引用的对象
第二阶段:遍历整个堆,把未标记的对象清除
缺点:此算法需要暂停整个应用,同时会产生内存碎片
复制(Copying)算法
讲内存分为两部分,收集时,存活对象从一部分移动到另一部分,如此往复
第一阶段:把内存空间分为两个相等的区域,每次只用其中一个区域
第二阶段:垃圾回收时,遍历当前使用区域,把正在使用的对象复制到另一个区域
优点:只处理正在使用中的对象,复制成本比较小,同时还能进行相应的内存整理
缺点:需要两倍的内存空间
标记——整理(Mark—Compact)算法
结合"标记—清除"和"复制"算法的优点
第一阶段:从引用根节点开始标记所有被引用的对象
第二阶段:遍历整个堆,清除未标记的对象并且把存活对象"压缩"到堆的其中一块,按顺序排放
优点:避免了产生内存碎片,也避免了使用更多的内存空间
分代收集(Generational Collecting)算法
基于对对象生命周期分析后得到的垃圾回收算法,它把对象分为年轻代、老年代、持久代。对不同生命周期的对象使用不同的算法