Full GC (Metadata GC Threshold)
Metaspace參考:https://blog.csdn.net/xlnjulp/article/details/46763045
#首先排查JVM的問題,就要把GC日誌開啟
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Full GC (Metadata GC Threshold)原因描述
通過GC日誌可以看到,old區離最大配置還很遠,Metaspace區並沒有真正釋放空間,所以懷疑是Metaspace區不夠用了。
以前只認為,Metaspace區是儲存在本地記憶體中,是沒有上限的,經查閱資料才發現,原來JDK8中,XX:MaxMetaspaceSize確實是沒有上限的,最大容量與機器的記憶體有關;但是XX:MetaspaceSize是有一個預設值的:21M。問題就出在這裡。
#Full GC (Metadata GC Threshold)最終解決方案
既然問題找到了,那麼就設定一個XX:MetaspaceSize的JVM啟動引數:-XX:MetaspaceSize=128M.
#Metaspace配置說明
從JDK8開始,永久代(PermGen)的概念被廢棄掉了,取而代之的是一個稱為Metaspace的儲存空間。Metaspace使用的是本地記憶體,而不是堆記憶體,也就是說在預設情況下Metaspace的大小隻與本地記憶體大小有關。當然你也可以通過以下的幾個引數對Metaspace進行控制:
* -XX:MetaspaceSize=N *
這個引數是初始化的Metaspace大小,該值越大觸發Metaspace GC的時機就越晚。隨著GC的到來,虛擬機器會根據實際情況調控Metaspace的大小,可能增加上線也可能降低。在預設情況下,這個值大小根據不同的平臺在12M到20M浮動。使用java -XX:+PrintFlagsInitial命令檢視本機的初始化引數,-XX:Metaspacesize為21810376B(大約20.8M)。
-XX:MaxMetaspaceSize=N
這個引數用於限制Metaspace增長的上限,防止因為某些情況導致Metaspace無限的使用本地記憶體,影響到其他程式。在本機上該引數的預設值為4294967295B(大約4096MB)。
-XX:MinMetaspaceFreeRatio=N
當進行過Metaspace GC之後,會計算當前Metaspace的空閒空間比,如果空閒比小於這個引數,那麼虛擬機器將增長Metaspace的大小。在本機該引數的預設值為40,也就是40%。設定該引數可以控制Metaspace的增長的速度,太小的值會導致Metaspace增長的緩慢,Metaspace的使用逐漸趨於飽和,可能會影響之後類的載入。而太大的值會導致Metaspace增長的過快,浪費記憶體。
-XX:MaxMetasaceFreeRatio=N
當進行過Metaspace GC之後, 會計算當前Metaspace的空閒空間比,如果空閒比大於這個引數,那麼虛擬機器會釋放Metaspace的部分空間。在本機該引數的預設值為70,也就是70%。
-XX:MaxMetaspaceExpansion=N
Metaspace增長時的最大幅度。在本機上該引數的預設值為5452592B(大約為5MB)。
-XX:MinMetaspaceExpansion=N
Metaspace增長時的最小幅度。在本機上該引數的預設值為340784B(大約330KB為)。
#
相關文章
- Minor GC、Major GC以及Full GC的介紹及對比GC
- JVM 系列文章之 Full GC 和 Minor GCJVMGC
- 總結Minor GC、Full GC觸發條件GC
- JVM垃圾回收——新生代,老年代,永久代,Minor GC,Full GCJVMGC
- jvm hotspot的minor major full gc之間的關係,以及哪些情況下會觸發full gcJVMHotSpotGC
- [Inside HotSpot] Serial垃圾回收器Full GCIDEHotSpotGC
- Java GC專家系列4:Apache的MaxClients設定及其對Tomcat Full GC的影響JavaGCApacheclientTomcat
- 從CLR GC到CoreCLR GCGC
- GCGC
- GC.MaxGeneration屬性【GC示例】GC
- 案例分享-full gc導致k8s pod重啟GCK8S
- 觸發JVM進行Full GC的情況及應對策略JVMGC
- 從一次 FULL GC 卡頓談對服務的影響GC
- GC是什麼?為什麼要有GC?GC
- Android GC,JVM MinorGC/ MajorGC/ FullGC,GC目的AndroidGCJVM
- 線上排查:記憶體異常使用導致full gc頻繁記憶體GC
- 每日一個知識點:什麼時候會觸發Full GCGC
- gc buffer busyGC
- gc 檢視GC
- System.gc()GC
- GC故障2GC
- GC故障3GC
- P於GCGC
- java GC CollectorJavaGC
- gc current block pin time gc current block flush time 疑惑GCBloC
- Java GC 專家系列3:GC調優實踐JavaGC
- 什麼是垃圾蒐集(GC)?為什麼要有GC呢?GC
- Unity GC垃圾回收UnityGC
- python的GCPythonGC
- Java——GC(垃圾回收)JavaGC
- JVM系列之GCJVMGC
- gc/Agent passwd resetGC
- 頻繁GC (Allocation Failure)及young gc時間過長分析GCAI
- 【JVM第八篇--垃圾回收】GC和GC演算法JVMGC演算法
- GC_EXTERNAL_ALLOCfreed與GC_EXPLICITfreed是什麼?GC
- 【GC】安裝GC之前需要調整的幾個引數GC
- gc cr request等待事件GC事件
- JAVA GC日誌分析JavaGC