我这篇文章是为了解答为何我们要避免在年轻代GC的时候扫描老年代。所以前面的假设都是,我们并没有剪枝这种逻辑。也就是从最朴素的两个分代假设出发,从年轻代出发全部遍历一遍,然后就能发现,一方面是年轻代指向老年代的引用会迫使将老年代也遍历,另一方面是如果外部引用直接引用老年代对象而我们并不扫描老年代,会出现漏洞。
于是就能看到,我们回收年轻代的时候,都要面对的问题就是:如何处理老年代。
后面的逻辑就是,如果我们要遍历老年代,那么代价就太大,所以我们要避免遍历老年代。避免遍历老年代,那就是跨代引用成为GC root。然后前面两个人评论的,为何到老年代要停下来——即所谓的剪枝,也是因为年轻代的回收跑过去遍历老年代是一种开销大而且收益小的行为。
为什么跨代引用是GC root昨日,有人在一个JVM群里问了一个问题,为什么跨代引用是gc root。这虽然是一个很简单的问题,但是其实涉及到了分代垃圾回收算法的核心理念。 gc root的基本解释 首先...