Metadata GC Threshold導致的full gc分析


   

 

 

 

 

gc log

兩次full gc 均是Metadata GC導致,

OpenJDK 64-Bit Server VM (25.151-b12) for linux-amd64 JRE (1.8.0_151-b12), built on Oct 20 2017 13:44:55 by "mockbuild" with gcc 4.8.5 20150623 (Red Hat 4.8.5-16)
Memory: 4k page, physical 32768212k(24960168k free), swap 16777212k(16777212k free)
CommandLine flags: -XX:InitialHeapSize=4294967296 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1415577600 -XX:NewSize=1415577600 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=6 -XX:-UseAdaptiveSizePolicy -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
3.239: [GC (Metadata GC Threshold) [PSYoungGen: 580899K->44848K(1209856K)] 580899K->44936K(4021760K), 0.0709512 secs] [Times: user=0.28 sys=0.05, real=0.07 secs] 
3.310: [Full GC (Metadata GC Threshold) [PSYoungGen: 44848K->0K(1209856K)] [ParOldGen: 88K->42742K(2811904K)] 44936K->42742K(4021760K), [Metaspace: 20807K->20807K(1069056K)], 0.0687655 secs] [Times: user=0.53 sys=0.06, real=0.07 secs] 
4.877: [GC (Metadata GC Threshold) [PSYoungGen: 295888K->14853K(1209856K)] 338631K->57604K(4021760K), 0.0168992 secs] [Times: user=0.10 sys=0.04, real=0.01 secs] 
4.894: [Full GC (Metadata GC Threshold) [PSYoungGen: 14853K->0K(1209856K)] [ParOldGen: 42750K->19141K(2811904K)] 57604K->19141K(4021760K), [Metaspace: 34824K->34824K(1081344K)], 0.0531168 secs] [Times: user=0.39 sys=0.02, real=0.06 secs] 
176.369: [GC (Allocation Failure) [PSYoungGen: 1037312K->21557K(1209856K)] 1056453K->40706K(4021760K), 0.0291270 secs] [Times: user=0.21 sys=0.01, real=0.03 secs] 
179.483: [GC (Allocation Failure) [PSYoungGen: 1058869K->34528K(1209856K)] 1078018K->53685K(4021760K), 0.0485665 secs] [Times: user=0.16 sys=0.13, real=0.05 secs] 
182.920: [GC (Allocation Failure) [PSYoungGen: 1071840K->47968K(1209856K)] 1090997K->67125K(4021760K), 0.0436580 secs] [Times: user=0.22 sys=0.00, real=0.04 secs] 
186.455: [GC (Allocation Failure) [PSYoungGen: 1085280K->62016K(1209856K)] 1104437K->81181K(4021760K), 0.0642786 secs] [Times: user=0.25 sys=0.23, real=0.07 secs] 
190.285: [GC (Allocation Failure) [PSYoungGen: 1099328K->77280K(1209856K)] 1118493K->96445K(4021760K), 0.0695328 secs] [Times: user=0.35 sys=0.21, real=0.07 secs]

加上 Metadata的配置參數: -XX:MetaspaceSize=128M

附上 metadata的配置說明

從JDK8開始,永久代(PermGen)的概念被廢棄掉了,取而代之的是一個稱為Metaspace的存儲空間。Metaspace使用的是本地內存,而不是堆內存,也就是說在默認情況下Metaspace的大小只與本地內存大小有關。當然你也可以通過以下的幾個參數對Metaspace進行控制:

* -XX:MetaspaceSize=N * 
這個參數是初始化的Metaspace大小,該值越大觸發Metaspace GC的時機就越晚。隨着GC的到來,虛擬機會根據實際情況調控Metaspace的大小,可能增加上線也可能降低。在默認情況下,這個值大小根據不同的平台在12M到20M浮動。使用java -XX:+PrintFlagsInitial命令查看本機的初始化參數,-XX:Metaspacesize21810376B(大約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為)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM