亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JVM元空間在調整大小時是否總是觸發GC

JVM元空間在調整大小時是否總是觸發GC

慕森卡 2023-04-19 15:02:33
對于 Java 8 之后的 JVM當 metaspace 的大小 > 時-XX:metaspaceSize,會觸發 gc。不管你如何配置-XX:metaspaceSize,-XX:maxMetaspaceSize元空間的初始大小在64位服務器上通常是一個固定值(20.8M)。當 JVM 接近當前容量時,它會自動調整元空間的大小。那么以-XX:metaspaceSize20G為例,當前metaspace大小為18M,需要分配大量新對象(100M左右),JVM必須為這些新對象resize metaspace,JVM會不會在resize之前觸發full GC ?
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

首先,“元空間的大小”是模棱兩可的,因此沒有上下文就沒有意義。至少有五個指標:reserved、committed、capacityused?memory ,如this answer中所述,以及高水位線,也稱為capacity_until_gc。

http://img4.sycdn.imooc.com/643f925f0001ee8c04930422.jpg

元空間不僅僅是一個連續的內存區域,因此它不會按常識調整大小。相反,當分配發生時,上述一個或多個指標會發生變化。

  1. 在最快的路徑上,從當前塊中分配一塊元數據。used在這種情況下,內存會增加,僅此而已。

  2. 如果當前塊中沒有足夠的空間,JVM 會搜索可能空閑的現有塊。如果成功重用塊,capacity則增加。直到此時才會發生 GC。

  3. 如果沒有空閑塊,JVM 會嘗試提交更多內存,除非新committed大小超過capacity_until_gc.

  4. 如果capacity_until_gc達到閾值,JVM 將觸發 GC 周期。

  5. 如果 GC 沒有釋放足夠的內存,則會增加高水位線,以便分配另一個虛擬空間。

GC 之后,高水位線值根據以下JVM 標志進行調整:

  • -XX:MinMetaspaceFreeRatio(用于計算元空間容量中需要多少可用空間來決定增加多少HWM);

  • -XX:MaxMetaspaceFreeRatio(用于決定在降低 HWM 之前元空間容量中需要多少可用空間);

  • -XX:MinMetaspaceExpansion(以字節為單位的元空間的最小擴展);

  • -XX:MaxMetaspaceExpansion(沒有完全 GC 的 Metaspace 的最大擴展)。

TL;DR沒那么簡單。JVM 絕對可以在不觸發 GC 的情況下提交更多的 Metaspace 內存。但是,當達到 HWM 時,將觸發 GC,并根據人體工程學策略重新計算 HWM。


查看完整回答
反對 回復 2023-04-19
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

您可以配置元空間大小,但 JVM 可以根據相關平臺增加或減少大小。

-XX:MetaspaceSize=大小

設置分配的類元數據空間的大小,該空間將在第一次超出時觸發垃圾回收。垃圾回收的閾值根據使用的元數據量增加或減少。默認大小取決于平臺。


查看完整回答
反對 回復 2023-04-19
  • 2 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號