2015-09-09 81 views
0
XX:MaxTenuringThreshold=15 

in JRE7。如果在eden + s1 + s2空間中沒有留下任何空間呢? younggen會拋出內存不足嗎? 我沒有看到這種情況發生,但是如果有人經歷過這種事,我會好奇的。Can Younggen會拋出內存錯誤嗎?

回答

1

這可能取決於實施,但通常不是,因爲它不是一個設定值,只是一個上限。如果在伊甸園和/或倖存者空間中沒有更多空間,那麼當該對象被直接複製到舊的源時,當那裏沒有空間時,JVM首先嚐試執行收集。即使你設置了XX:MaxTenuringThreshold=0,這也意味着對象會立即被提升。

要考慮到這個參數設置上限值,則實際值決定by the JVM

最大值爲tenuring閾值。默認值是15。

由於documentation狀態:

時,因爲它是內存不足Java虛擬機無法分配一個對象,可以由被提供沒有更多的內存時垃圾收集器。

當s1和s2之間的交換次數超過該值並且舊gen中沒有空閒內存(並且GC不能釋放任何內存)時,問題就會開始。

考慮到將該值設置得太低可能會成爲一個問題,因爲如果您的對象很短,但會過快地升級到舊版本。另一方面,如果大多數對象都是長期存在的,那麼讓它們在s1和s2之間交換也不是一個好主意。

+0

感謝您的回覆和詳細的說明。然而,我有類似的理解,沒有看到在行動中,所以問道。如果eden會在Java堆中可用的時間空間(通常是3倍大)時出現空間不足的情況,那麼這種方法就沒有任何意義。我認爲「考慮到該參數設置了上限,實際值由JVM決定」進一步澄清了這一點。再次感謝。 – Ashley

0

如果在eden + s1 + s2空間中沒有留下任何空間,該怎麼辦?

這會觸發完整的GC。這會導致所有對象被複制到終身空間中。終身空間通常可以調整大小,但是如果您防止這種情況和終身空間填滿,則會出現OutOfMemoryError。