我這篇文章是為了解答為何我們要避免在年輕代GC的時(shí)候掃描老年代。所以前面的假設(shè)都是,我們并沒有剪枝這種邏輯。也就是從最樸素的兩個(gè)分代假設(shè)出發(fā),從年輕代出發(fā)全部遍歷一遍,然后就能發(fā)現(xiàn),一方面是年輕代指向老年代的引用會迫使將老年代也遍歷,另一方面是如果外部引用直接引用老年代對象而我們并不掃描老年代,會出現(xiàn)漏洞。
于是就能看到,我們回收年輕代的時(shí)候,都要面對的問題就是:如何處理老年代。
后面的邏輯就是,如果我們要遍歷老年代,那么代價(jià)就太大,所以我們要避免遍歷老年代。避免遍歷老年代,那就是跨代引用成為GC root。然后前面兩個(gè)人評論的,為何到老年代要停下來——即所謂的剪枝,也是因?yàn)槟贻p代的回收跑過去遍歷老年代是一種開銷大而且收益小的行為。
為什么跨代引用是GC root昨日,有人在一個(gè)JVM群里問了一個(gè)問題,為什么跨代引用是gc root。這雖然是一個(gè)很簡單的問題,但是其實(shí)涉及到了分代垃圾回收算法的核心理念。 gc root的基本解釋 首先...