2017-09-29 18 views
1

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html,我發現,對象JVM記錄發生次數:對象或塊上的JVM記錄生成計數嗎?

在接下來的未成年人GC,同樣的事情發生在伊甸園的空間。 將刪除未引用的對象,並將引用的對象移至 倖存者空間。然而,在這種情況下,他們被移動到第二個倖存者空間(S1) 。另外,來自 上的最後一個次要GC的對象的第一個倖存者空間(S0)的年齡增加了並將 移至S1。一旦所有存活的對象都被移動到S1,S0和伊甸園被清除。注意我們現在在 倖存者空間中有不同年齡的物體。

JVM record generation count on object

但是,從Java的第4,第124頁思考,筆者說的內存塊JVM記錄發生次數:

正如前面提到的,在描述這裏的JVM內存以大塊分配 。如果你分配一個大對象,它會得到它自己的塊。 嚴格的停止和複製要求將源堆中的每個活動對象複製到新堆中,然後才能釋放舊堆棧,而將其轉換爲大量內存。通過塊,垃圾收集可以通過 收集時將對象複製到死區。 每個塊都有一個 代數來跟蹤它是否存在。在正常的 的情況下,只有自上次垃圾回收後創建的塊被壓縮爲 ;如果他們的 從某處被引用,所有其他塊得到他們的世代計數顛簸。這處理了 大量短暫臨時對象的正常情況。定期地,完整的掃描是 大型對象仍然不會被複制(它們只是獲得它們的 世代計數),包含小對象的塊是 複製和壓縮。 JVM監控垃圾收集的效率,如果因爲所有對象都是 長期存在而浪費時間,那麼它將切換到標記和掃描。同樣,JVM 會跟蹤標記和掃描的成功程度,並且如果堆 開始變成碎片,它將切換回停止並複製。這 是這裏的「適應性」的一部分進來,這樣你就結束了一個拗口:「自適應世代停止與複製標記-andsweep」

哪一個是正確的?或者也許他們只是在說一些不同的東西?請幫我弄清楚。

+2

Oracel JVM大約有六個垃圾收集器。你確定兩個摘錄都指向同一個嗎? – EJP

+0

第一個引用描述了*複製*收集器,第二個描述了*壓縮*收集器。目前的JVM通常使用年輕一代的複製收集器和舊一代的壓縮收集器。後者是組織*卡*爲大多數可用的垃圾收集器。這些卡可以在幾個技術方面與引用的塊相匹配,但也可能有一些差異。 – Holger

回答

1

在HotSpot JVM(Oracle的JVM)中,幾個位保留用於對象頭中的對象時間。位數可能有所不同,但至少有4位可用於任何配置。

因此,對每個對象單獨追蹤年齡。對於HotSpot JVM上的所有收集器都是如此。

雖然其他供應商可能有不同的方法。例如。 Azul Zing追蹤內存塊粒度。