2 回答

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

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