jvm分配擔保機制

2021-09-27 08:30:49 字數 782 閱讀 5723

在發生minor gc之前,虛擬機會先檢查老年代最大可用的連續空間是否大於新生代所有物件總空間。如果這個條件成立,那麼minor gc可以確保是安全的。如果不成立,則虛擬機會檢視handlerpromotionfailure設定是否允許擔保失敗。如果允許,那麼會繼續檢查老年代最大可用的連續空間是否大於歷次晉公升到老年代物件的平均大小。如果大於,將嘗試著進行一次monitor gc,儘管這次gc是有風險的。如果小於,或者handlerpromotionfailure設定不允許冒險,那這時也要改為進行一次full gc了。

上述所說的冒險到底是冒的什麼險呢?

前面提到過,新生代使用複製收集演算法,但是為了記憶體利用率。只使用其中乙個survivor空間來作為輪換備份,因此當出現大量物件在minor gc後仍然存活的情況(最極端的情況是記憶體**之後,新生代中所有的物件都存活),就需要老年代進行分配擔保,把survivor無法容納的物件直接進入老年代。老年代要進行這樣的擔保,前提是老年代本身還有容納這些物件的剩餘空間,一共有多少物件存活下來在實際完成記憶體**之前是無法明確知道的,所以只好取之前每一次**晉公升到老年代物件容量的平均大小值作為經驗值,與老年代的剩餘空間進行比較,決定是否進行full gc來讓老年代騰出更多空間。

取平均值進行比較其實仍然是一種動態概率的手段,也就是說,如果某次minor gc存活後的物件突增,遠遠高於平均值的話,依然會導致擔保失敗。如果出現handlerpromotionfailure失敗,那就只好在失敗後重新發起一次full gc。雖然擔保失敗時繞的圈子是最大的,但大部分情況下都還是將handlerpromotionfailure開關開啟,避免full gc過於頻繁。

JVM 空間分配擔保

在發生minor gc之前,虛擬機會檢測 老年代最大可用的連續空間 新生代all物件總空間?1 滿足,minor gc是安全的,可以進行minor gc。2 不滿足,虛擬機器檢視handlepromotionfailure引數 1 為true,允許擔保失敗,會繼續檢測老年代最大可用的連續空間 歷次晉...

空間分配擔保

新生代採用的複製演算法,留空乙個 survivor 作為空間備份,當大量物件在 minor gc後仍然存活,survivor 無法放下,則會直接進入老年代,需要老年代的空間保證能容納得下這些物件。空間擔保比較的是 老年代最大的連續空閒空間 和 年輕代所有物件的記憶體大小 或 歷次晉公升到老年代的平均...

JVM記憶體分配

堆區 儲存的全部是物件,每個物件都包含乙個與之對應的class的資訊。class的目的是得到操作指令 vm只有乙個堆區 heap 被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身 棧區 每個執行緒包含乙個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用 不是物件 物件都存放在堆區中...