簡體   English   中英

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

[英]Does JVM metaspace always trigger GC when resizing

對於Java 8之后的JVM

  1. 當metaspace的大小> -XX:metaspaceSize ,它將觸發gc。
  2. 無論您如何配置-XX:metaspaceSize-XX:maxMetaspaceSize ,元空間的初始大小通常在64位服務器上都是固定值(20.8M)。
  3. 當JVM接近當前容量時,它將自動調整元空間的大小。
  4. 然后,例如,如果-XX:metaspaceSize為20G,則元空間的當前大小為18M,並且必須分配大量新對象(約100M),JVM必須為這些新對象調整元空間的大小,JVM會觸發調整大小之前是完整的GC?

首先, “元空間的大小”是模棱兩可的,因此在沒有上下文的情況下毫無意義。 至少有五個指標: 此答案中描述的預留 ,已提交容量和已內存,以及高水位標記,也稱為Capacity_until_gc

元空間布局

元空間不僅僅是內存的一個連續區域,因此按常識它不會調整大小。 而是在發生分配時,上述指標中的一項或多項發生更改。

  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。

您可以配置元空間大小,但是JVM可以根據所依賴的平台來增加或減小大小。 請參閱Oracle文檔。

-XX:MetaspaceSize =大小

設置分配的類元數據空間的大小,該類元數據空間將在首次超過垃圾收集時觸發垃圾收集。 垃圾收集的閾值取決於使用的元數據量而增加或減少。 默認大小取決於平台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM