如果老生代的区域中有对象正在引用着新生代中的一些对象,而新生代区域正在发生着gc,如何去检测出所有的被老生区域引用的对象呢?
首先,肯定是不会通过root nodes去检查所有新生区node的可访问性,太笨了;取而代之的是在老生代区域中有一块大小为512kb的内存,称之为”card table”,记录着任何一个被老生代引用的新生代的内存地址(引用)。当新生代的gc发生时,虚拟机不会去老生代中哪些对象持有着新生代的引用,而是去检查这个”card table”中含有哪些新生代的引用,这样就极大的减少了”无用”的对象reachable的次数,从而减少gc的time。
这个所谓的”card table”区域是被一个”write barrier”设备管理着的,这个设备使得minor GC过程更高效,虽然这样操作也会导致部分的开销,但是总体上GC所消耗的时间还是减少了。
ps:对象被归为回收对象的条件不仅仅只是not reachable,还有一个就是对象中的finalize()内的内容,如果是不可访问到的话首先是被丢到一个待处理的队列中,然后检测队列中每一个对象的finalize()函数如果在此函数中对象仍未能构建出roots对自身的一个引用关联的话,对象菜正式的被宣告死亡。所以在finalize()里告诉虚拟机,觉得自己还是可以救一下的。