Metadata GC Threshold致使的full gc分析

   

 

 

 

 

gc logjava

两次full gc 均是Metadata GC致使,linux

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

ui

附上 metadata的配置说明spa

从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认状况下Metaspace的大小只与本地内存大小有关。固然你也能够经过如下的几个参数对Metaspace进行控制:code

* -XX:MetaspaceSize=N * 
这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际状况调控Metaspace的大小,可能增长上线也可能下降。在默认状况下,这个值大小根据不一样的平台在12M到20M浮动。使用java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:Metaspacesize21810376B(大约20.8M)。blog

-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%。it

-XX:MaxMetaspaceExpansion=N 
Metaspace增加时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。io

-XX:MinMetaspaceExpansion=N 
Metaspace增加时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

相关文章
相关标签/搜索