GC
GC需要处理的是:哪些对象没用了需要清理、什么时候回收、如果清理
哪些对象需要清理?
判断一个对象是否需要回收有两种方式:引用计数方式、可达性分析算法
引用计数方式
对对象的引用进行计数,计数为0则是需要清理的对象,>=1则是需要持有的。无法处理的问题是在循环引用的时候是无法处理。这只是一个描述GC理论说法,其实没有真正的JVM是中这种算法实现的。
GC需要处理的是:哪些对象没用了需要清理、什么时候回收、如果清理
判断一个对象是否需要回收有两种方式:引用计数方式、可达性分析算法
对对象的引用进行计数,计数为0则是需要清理的对象,>=1则是需要持有的。无法处理的问题是在循环引用的时候是无法处理。这只是一个描述GC理论说法,其实没有真正的JVM是中这种算法实现的。
在Regin间对象相互引用时G1如何完成Root-Tracing
假如在对一个 Region 进行 GC,称他为 S1,上面有一个对象 O1 需要进行可达性分析。 如果没有其他 Region 上的对象引用 O1,那么皆大欢喜, 只在 S1 上就能确定 O1 是否可达(不可达就是需要清理)。如果有其他 Region 上的对象引用 O1,如果还不只一个,那么处理起来就比较麻烦了,笨办法就是去遍历,这当然不是一个好办法。
可达性分析算法是用来寻找堆中哪些对象是需要被回收哪些是存活用的。他的原理是选择一些根对象作为基础,从这些根对象出发需找这些对象引用的对象。在递归寻找子对象之后,就能行程一颗庞大的树。在这棵树上的对象都是存活的,不在这课树上的对象是需要清理的。
CardTable 是一种 JVM 实现中用到的一种数据结构。CardTable 是一个字节数组,数组中的每一位表示年老代的某一区域中的所有对象是否持有新生代对象的引用。如果持有就是 1,如果不持有就是 0。