面试官:你知道JVM的卡表吗?

跨代引用

对象不是孤立的,对象之间会存在跨代引用,假如现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代中的东西是完全有可能被来老年代所引用的,为了找出该区域中的存活对象,不得不在固定的GC Roots之外再额外遍历整个老年代中所有的东西来确保可达性分析结果的正确性。 JVM将堆内存进行了分代,对象间可能存在跨代引用,那么每次进行GC的时候都需要进行全堆扫描判断是否有引用吗?答案并不是,JVM通过卡表的的技术来解决这个问题。

跨代引用假说

跨代引用相对于同代引用来说占极少数。 存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。举例,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生对象在收集时同样得以存活,进而咋年龄增长后晋升到老年代中,这时跨代引用也随机被消除了。 因此依据这条假说,我们就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结果(该结构被称为“记忆集”,以下说的“卡表”就是“记忆集”的一种实现),这个结果把老年代分成若干小块,标识出老年代的哪一块内存会存在跨代引用。此后当发生

猜你喜欢

转载自blog.csdn.net/uniquewonderq/article/details/130260199