2016-01-28 60 views
3

將舊物體放在舊區域或將其保存在倖存區域的標準是什麼?對象在G1(垃圾優先)垃圾收集器上的年齡如何?

official tutorial狀態的楊GC的點4:

「實時對象被抽空(即,複製或移動)到一個或多個 倖存者區域如果老化閾值被滿足時,一些對象 被提升到老一代地區。「

但我找不到那個標準是什麼。

編輯:

阿米特Bhati向我指出的MaxTenuringThreshold參數。我對官方文檔瞭解不多,但我想我已經開始理解它是如何工作的。

回答

1

Javadocs

堆空間劃分爲舊的和新的一代。新一代 包括新的對象空間(伊甸園)和兩個倖存者空間 。 JVM在eden空間中分配新對象,並將新一代對象從較長時間移動到舊一代。

年輕一代使用快速複製垃圾收集器,其 採用兩個半空間(生存空間)在伊甸,從一個倖存者空間到所述第二複製 存活的對象。對象, 生存多個年輕的空間集合終身,這意味着他們 複製到終身代。年齡增長較大,並且 填寫速度較慢。所以,垃圾收集較少; 並且每個收藏都需要比年輕的空間收藏更長的時間。 收集終身空間也被稱爲做一個完整的 代收集。

頻繁的年輕空間收集是快速(幾毫秒), 而全新一代收集需要較長(幾十 毫秒到幾秒,這取決於堆的大小)。其他GC算法,如併發標記掃描(CMS) 算法,是增量式的。他們將完整的GC分成幾個 增量件。這提供了很小的暫停的可能性。 此過程帶有一個開銷,並不是企業 Web應用程序所必需的。

同時檢查這篇文章:Java Garbage Collectors – Moving to Java7 Garbage-First (G1) Collector

enter image description here

一個伊甸園的年輕一代包括和兩個Survivor空間。 Eden中的活體被複制到最初爲空的倖存者 的空間,在圖中標記爲S1,除了那些太大而不適合在S1空間中的 。這些對象直接複製到老一代 。被佔據的倖存者空間 (標記爲S0)中的活物也被複制到其他倖存者空間,而相對較舊的對象被複制 到老一代。如果S1空間變滿,則來自Eden或S0的尚未複製到其中的活動對象 將被終身使用,不論其年齡如何,均爲 。在Eden或S0空間 中保留的任何對象已被複制後都不是活動的,並且不需要檢查 。下圖顯示了堆後年輕一代 集合:

enter image description here

年輕一代集合導致停止世界的停頓。經過 收集後,伊甸園和一個倖存者空間都是空的。現在讓我們來看看CMS如何處理舊一代收集。它主要由兩個主要步驟組成 - 標記所有活物並清掃它們。

+0

增加整個YoungGen通過NewRatio或只是SurvivorSpace。粗體文本不是很具體,我不確定G1 GC使用與其他GC相同的標準。我認爲你的答案大部分只適用於較老的GC。 – aalku

1

有了您的幫助,我想我找到了答案here

-XX:InitialTenuringThreshold = 7設置在平行年輕收藏家自適應GC上漿使用的最初tenuring閾值。 持久門檻是一個物體在被提升到舊的或終身的一代之前在一個年輕的 集合中存活的次數。 -XX:MaxTenuringThreshold = n設置在自適應GC大小調整中使用的最大使用期限。當前最大值爲15.並行收集器的默認值 值爲15,CMS爲4。

它是下調試選項標題:)

垃圾第一(G1)垃圾收集選項你可以找到這樣的:

-XX:MaxTenuringThreshold = N佔有率閾值的最大值。默認值爲15.

如果您沒有讀取其他部分的InitialTenuringThreshold描述,則這不是很具描述性。看起來InitialTenuringThreshold不是一個有效的G1選項,但我認爲該算法是在那裏描述的。

1

下面的文檔很好地解釋瞭如何在G1收集器中更改(減少)項目從存活空間升級到舊版本的速率。

http://java-is-the-new-c.blogspot.co.uk/2013/07/tuning-and-benchmarking-java-7s-garbage.html

正如上述回答說(有權調整年輕一代的部分),該MaxTenuringThreshold是關鍵設置,但這只是一個上限,如果你的YoungGen並不大也會被忽略足以讓這個榮幸。在這種情況下,您需要通過NewRatio或通過SurvivorRatio

+0

分析看起來不錯。謝謝。 – aalku