2014-09-25 82 views
2

我昨天讀了關於垃圾收集的內容,我不明白它的一些概念。我讀過,對於次要收集通常是使用複製技術將可到達的對象移動到生存空間,對於主要收集它通常使用標記和掃描。Java內存區域和垃圾收集器

我不明白的第一件事就是垃圾收集器從gc根開始,沿着圖形移動來檢測活動實例,但它如何知道哪個對象是年輕的,哪個對象是舊的?它如何知道哪個內存區域對象駐留在?

第二件事是,如果我們只做次要收集,gc如何知道年輕一代中的對象是不是被舊世代中的對象引用,還是來自方法區域的靜態引用?

最後一點是標記和掃描後有時會完成壓縮。 gc如何知道移動對象的哪些引用必須更新?如果我們有一個包含數千個線程的程序,其中包含巨大的幀堆棧和千兆字節的堆,它是否有一些內部結構具有地圖或其他形式的信息?

謝謝!

回答

0
  1. GC每次檢查是否可以收集對象時,都會在對象中增加一個計數器,告訴它該對象已被GC訪問了多少次。這是告訴何時需要將對象從年輕一代轉移到終身一代的最簡單方法。但是至於知道對象在哪個區域,可以使用對象的地址來計算它。 (例如,JVM只會說0-100之間的存儲器地址是年輕一代,101+是終身一代。)
  2. 即使在次要集合期間,也會遍歷整個對象圖來檢查引用。至少在理論上這是發生了什麼,實踐中會有一些優化。但總的想法是這樣的。
  3. 由於第一步是構建引用圖,該信息在壓縮階段仍可用。但是,千兆字節堆積的壓縮需要很長時間。
1

答案取決於GC算法,所以你會發現答案的一些變化。

GC如何知道哪個對象是年輕的,哪個對象是舊的?它如何知道哪個內存區域對象駐留在?

該對象的內存地址將回答,因爲每個區域往往是固定的位置。調整大小是可能的,但只有當JVM暫停了所有工作線程時纔會發生。請記住G1收集器沒有世代,所以答案在所使用的算法上有所不同。

gc如何知道年輕一代中的對象是否未被舊代中的對象或方法區域的靜態引用引用?

一些GC算法將對堆中的所有對象執行全面掃描。其他人則依賴於觀察到從舊到舊的參考文獻數量相對較少,因此JVM會跟蹤它們並將它們用作標記目的的根源。其機制通常是記分卡系統,這就是爲什麼有些具有非常大的祖先空間的GC算法會減慢年輕空間的GC。因爲每個對象的每張記分卡都必須進行檢查,看看它是否可以有一個指向年輕一代的指針。

最後一點是標記和掃描之後有時會完成壓縮。 gc如何知道移動對象的哪些引用必須更新?

此外,答案確實有所不同,因爲JVM允許改變這些細節。一些算法使用雙重間接,以便指針很容易定位和更新。這涉及爲每個對象存儲大型索引。但是,由於運行代碼不得不繼續查找對象的實際位置,所以在GC未運行時顯示會減慢用戶代碼的速度,所以有些GC算法會跟蹤引用。

Azul使用非常聰明的機制,它使內存頁無效並存儲在陷阱處理程序代碼中訪問的重定向映射。因此它只需要存儲已經移動的對象的地址。而其他GC算法在掃描活動對象時跟蹤信息。畢竟,我們不需要死者的信息。

+0

謝謝Chris!我可以請你在Geek的回答評論中檢查我的問題嗎? – alobodzk 2014-09-30 15:11:13

+0

@alobodzk如果我們選擇一種算法,我們可以更具體。因此,讓我們開始使用CMS,Oracle Hotspot的併發標記和掃描實現。他們年輕的GC使用通常的根源,即線程,本地調用等等。對於老一輩的年輕人來說,他們擁有大量的位,與老一代的每個內存地址對齊。每一點都說,可能是一個指向年輕人的指針(但可能是誤報)。年輕的gen掃描並從那裏紮根。這些被稱爲「卡表」。 – 2014-09-30 15:34:20

+0

卡表上的一些細節可以在這裏閱讀:http://mechanical-sympathy.blogspot.co.uk/2013/07/java-garbage-collection-distilled.html – 2014-09-30 15:35:05

1

YoungGen/OldGen & PermGen是Java Heap所在的三個領域。 JVM非常熟悉每個的邊界。

  1. 在收集垃圾時,GC首先決定運行哪個空間,然後確定該空間中每個對象的GC根。對象是年輕人還是老年人是由其駐留在堆中的空間指定的。 GC保持每個對象的狀態,例如每個對象有多少GC循環存活,這給GC一個估計時間是否適合將對象從Young移動到Old的估計。

  2. 一個對象圖決定一個年輕的Gen對象是否被舊的Gen引用引用。

  3. 如果一個對象被壓縮了,引用也被更新。這也發生在對象從Young> Old Gen移動時

+0

謝謝@Geek!還有一件事,GC如何進行小規模收集?它是否也會選擇GC根?我明白,在小規模收集中,你不想觸摸老一代的那些,那麼GC如何決定哪些GC根源應該在小規模收集中處理? – alobodzk 2014-09-30 15:08:44