2 回答

TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
首先,“元空間的大小”是模棱兩可的,因此沒有上下文就沒有意義。至少有五個指標(biāo):reserved、committed、capacity和used?memory ,如this answer中所述,以及高水位線,也稱為capacity_until_gc。
元空間不僅僅是一個連續(xù)的內(nèi)存區(qū)域,因此它不會按常識調(diào)整大小。相反,當(dāng)分配發(fā)生時,上述一個或多個指標(biāo)會發(fā)生變化。
在最快的路徑上,從當(dāng)前塊中分配一塊元數(shù)據(jù)。
used
在這種情況下,內(nèi)存會增加,僅此而已。如果當(dāng)前塊中沒有足夠的空間,JVM 會搜索可能空閑的現(xiàn)有塊。如果成功重用塊,
capacity
則增加。直到此時才會發(fā)生 GC。如果沒有空閑塊,JVM 會嘗試提交更多內(nèi)存,除非新
committed
大小超過capacity_until_gc
.如果
capacity_until_gc
達(dá)到閾值,JVM 將觸發(fā) GC 周期。如果 GC 沒有釋放足夠的內(nèi)存,則會增加高水位線,以便分配另一個虛擬空間。
GC 之后,高水位線值根據(jù)以下JVM 標(biāo)志進(jìn)行調(diào)整:
-XX:MinMetaspaceFreeRatio
(用于計算元空間容量中需要多少可用空間來決定增加多少HWM);-XX:MaxMetaspaceFreeRatio
(用于決定在降低 HWM 之前元空間容量中需要多少可用空間);-XX:MinMetaspaceExpansion
(以字節(jié)為單位的元空間的最小擴(kuò)展);-XX:MaxMetaspaceExpansion
(沒有完全 GC 的 Metaspace 的最大擴(kuò)展)。
TL;DR沒那么簡單。JVM 絕對可以在不觸發(fā) GC 的情況下提交更多的 Metaspace 內(nèi)存。但是,當(dāng)達(dá)到 HWM 時,將觸發(fā) GC,并根據(jù)人體工程學(xué)策略重新計算 HWM。

TA貢獻(xiàn)1872條經(jīng)驗 獲得超4個贊
您可以配置元空間大小,但 JVM 可以根據(jù)相關(guān)平臺增加或減少大小。
-XX:MetaspaceSize=大小
設(shè)置分配的類元數(shù)據(jù)空間的大小,該空間將在第一次超出時觸發(fā)垃圾回收。垃圾回收的閾值根據(jù)使用的元數(shù)據(jù)量增加或減少。默認(rèn)大小取決于平臺。
添加回答
舉報