簡體   English   中英

Java Metaspace Full GC

[英]Java Metaspace Full GC

我在使用 G1GC 時遇到了一些問題。

2400.241: [GC concurrent-root-region-scan-start]
2400.241: [Full GC (Metadata GC Threshold) 2400.252: [GC concurrent-root-region-scan-end, 0.0101404 secs]
2400.252: [GC concurrent-mark-start]
 1151M->603M(4356M), 2.6980537 secs]
   [Eden: 0.0B(2558.0M)->0.0B(2613.0M) Survivors: 55.0M->0.0B Heap: 1151.7M(4356.0M)->603.6M(4356.0M)], [Metaspace: 259187K->92248K(1034240K)]
 [Times: user=3.92 sys=0.00, real=2.70 secs] 

這需要很長時間,每 20-30 分鍾,元空間就會觸發一次完整的 gc。 我是這樣配置的:

  "-XX:MaxMetaspaceSize=768M",
  "-XX:MetaspaceSize=256M"

但是每次達到256M~都會觸發一次完整的gc。 當它達到第一個高水位線時,它下次不應該讓它變大直到最大尺寸嗎? 此外,元空間上的完整 gc 會觸發舊 gen 上的完整 gc? 我在某處讀過它,但我不確定。 這使 p99 響應時間比我預期的要高。

根據Triggering of gc on Metaspace memory in java 8 ,需要完整的 GC 以減少元空間使用。

我的理解是元空間本身不是垃圾收集的。 取而代之的是,普通堆中的對象持有對元空間對象的特殊引用。 當對象被 GC 收集時,相應的元空間對象被釋放。 (從概念上講,它就像終結器是free元空間對象的終結器。)

當它達到第一個高水位線時,它下次不應該讓它變大直到最大尺寸嗎?

顯然不是。 HotSpot 收集器的正常策略是這樣的:

  1. 分配對象,直到達到當前的堆限制
  2. 運行收集器
  3. 查看回收了多少空間,並在必要時增加(或減少)堆大小。

這里似乎使用了相同的策略。 並且完整的 GC 導致足夠的元空間被回收,它決定不需要擴展元空間。

對此的創可貼是嘗試將-XX:MetaspaceSize-XX:MaxMetaspaceSize設置為相同的值,但這只會降低完整 GC 的頻率。

一個真正的解決方案是弄清楚是什么在消耗元空間,並修復它。

暫無
暫無

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

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