我昨天讀了關於垃圾收集的內容,我不明白它的一些概念。我讀過,對於次要收集通常是使用複製技術將可到達的對象移動到生存空間,對於主要收集它通常使用標記和掃描。Java內存區域和垃圾收集器
我不明白的第一件事就是垃圾收集器從gc根開始,沿着圖形移動來檢測活動實例,但它如何知道哪個對象是年輕的,哪個對象是舊的?它如何知道哪個內存區域對象駐留在?
第二件事是,如果我們只做次要收集,gc如何知道年輕一代中的對象是不是被舊世代中的對象引用,還是來自方法區域的靜態引用?
最後一點是標記和掃描後有時會完成壓縮。 gc如何知道移動對象的哪些引用必須更新?如果我們有一個包含數千個線程的程序,其中包含巨大的幀堆棧和千兆字節的堆,它是否有一些內部結構具有地圖或其他形式的信息?
謝謝!
謝謝Chris!我可以請你在Geek的回答評論中檢查我的問題嗎? – alobodzk 2014-09-30 15:11:13
@alobodzk如果我們選擇一種算法,我們可以更具體。因此,讓我們開始使用CMS,Oracle Hotspot的併發標記和掃描實現。他們年輕的GC使用通常的根源,即線程,本地調用等等。對於老一輩的年輕人來說,他們擁有大量的位,與老一代的每個內存地址對齊。每一點都說,可能是一個指向年輕人的指針(但可能是誤報)。年輕的gen掃描並從那裏紮根。這些被稱爲「卡表」。 – 2014-09-30 15:34:20
卡表上的一些細節可以在這裏閱讀:http://mechanical-sympathy.blogspot.co.uk/2013/07/java-garbage-collection-distilled.html – 2014-09-30 15:35:05