[英]Does JVM metaspace always trigger GC when resizing
對於Java 8之后的JVM
-XX:metaspaceSize
,它將觸發gc。 -XX:metaspaceSize
和-XX:maxMetaspaceSize
,元空間的初始大小通常在64位服務器上都是固定值(20.8M)。 -XX:metaspaceSize
為20G,則元空間的當前大小為18M,並且必須分配大量新對象(約100M),JVM必須為這些新對象調整元空間的大小,JVM會觸發調整大小之前是完整的GC? 首先, “元空間的大小”是模棱兩可的,因此在沒有上下文的情況下毫無意義。 至少有五個指標: 此答案中描述的預留 ,已提交 , 容量和已用內存,以及高水位標記,也稱為Capacity_until_gc 。
元空間不僅僅是內存的一個連續區域,因此按常識它不會調整大小。 而是在發生分配時,上述指標中的一項或多項發生更改。
used
內存會增加,僅此而已。 capacity
增加。 在此之前,不會發生GC。 committed
大小超過capacity_until_gc
。 capacity_until_gc
達到閾值時,JVM觸發GC周期。 在GC之后,將根據以下JVM標志來調整高水位標記值:
-XX:MinMetaspaceFreeRatio
(用於計算在元空間容量中需要多少可用空間來決定增加HWM的多少); -XX:MaxMetaspaceFreeRatio
(用於在降低HWM之前確定元空間容量中需要多少可用空間); -XX:MinMetaspaceExpansion
(以字節為單位的元空間的最小擴展); -XX:MaxMetaspaceExpansion
(不具有完整GC的Metaspace的最大擴展)。 TL; DR並不是那么簡單。 JVM絕對可以在不觸發GC的情況下提交更多的Metaspace內存。 但是,達到HWM時,將觸發GC,並根據人體工程學策略重新計算HWM。
您可以配置元空間大小,但是JVM可以根據所依賴的平台來增加或減小大小。 請參閱Oracle文檔。
-XX:MetaspaceSize =大小
設置分配的類元數據空間的大小,該類元數據空間將在首次超過垃圾收集時觸發垃圾收集。 垃圾收集的閾值取決於使用的元數據量而增加或減少。 默認大小取決於平台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.