GC算法-分代垃圾回收
概述
分代垃圾回收
并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用.
简单来说, 分代垃圾回收
的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. 经验表明, 大部分对象在生成后马上就成了垃圾.
也就是说, 年轻人要多运动, 没事的时候多看看, 常回收. 老年人好静, 一般不去惊扰他老人家.
分代垃圾回收
就是利用这个现象, 将堆分为了新生代和老年代, 新生代的对象大部分会马上变成垃圾, 而新生代经历过几次回收后, 对象就会晋升到老年代中. 老年代中的对象不会经常回收. 然后, 就可以针对不同分代, 利用针对性的GC算法.
实现
还记得之前的标记复制算法
么? 将堆进行二等分. 在分代回收
中, 也将堆进行分块, 分为新生代堆以及老年代堆.
针对新生代: 利用复制
算法, 避免了内存碎片化, 同时分配内存更快速(因为新生代就是会频繁的申请内存). 同时将年龄大的对象加到老年代中.
当然, 在针对新生代的复制
中, 因为要通过根集合遍历所有活动对象, 也就是要对所有对象进行遍历, 为了减少遍历次数, 通过维护一个集合(保存所有老年代中引用了新生代对象的指针), 这样就能减少对象的遍历.
针对老年代: 直接使用标记清除
即可.
分析
通过对不同的对象有针对性的执行算法, 结合了不同算法的优点. 使得其吞吐量得到改善.对回收频繁的内存, 使用复制算法
速度快、内存分配也高效.
但是, 如果有的程序并并不符合年纪轻轻就死掉的规则, 一个程序的大部分对象都能够活很久, 那就适得其反了.
当然也不只有新生和老年两代, 也可以有多代.
针对分代垃圾回收就简单说一下, 因为JVM用的就是它, 网上一找一大把, 简直太多了.