可达性分析算法和CardTable
可达性分析算法
可达性分析算法是用来寻找堆中哪些对象是需要被回收哪些是存活用的。他的原理是选择一些根对象作为基础,从这些根对象出发需找这些对象引用的对象。在递归寻找子对象之后,就能行程一颗庞大的树。在这棵树上的对象都是存活的,不在这课树上的对象是需要清理的。
然后说 CardTable
CardTable 是一种 JVM 实现中用到的一种数据结构。CardTable 是一个字节数组,数组中的每一位表示年老代的某一区域中的所有对象是否持有新生代对象的引用。如果持有就是 1,如果不持有就是 0。
有了 CardTable 就能大大加快新生代 GC 的效率(Minor GC)。新生代 GC 发生的时候,新生代对象是可能被老生代内存中的对象引用的,如果新生带的对象被引用那么就不能被清理;如果没有被老生代引用,而且从根路径开始也没有链路可以到达这个新生代对象,那么他就是可以被清理的。这样势必就需要去遍历老生代的对象,去检查是否有老生代对象引用这些新生代对象。这个遍历消耗一定不小,这个时候 CardTable 就蹦出来说「俺能搞定!」。在遍历之初,先遍历 CardTable(因为是字节数组,遍历的速度会很快),如果是没有引用新生代对象的老生代区域,就直接忽略不去处理。如果是有引用新生代对象的老生代区域,才去遍历查看。