jvm metaspace导致FGC

事情是这样的,jdk使用的1.8版本的, 每次程序刚一启动,大概几十秒,就会发生两次FGC,原因是CMS Final Remark,具体参数如下,其中S0C=S1C=60M,Eden=480M,old=2G-新生代=2G-600M=1.4G,

jvm metaspace导致FGC_第1张图片

jvm metaspace导致FGC_第2张图片

从上图可以看到,S0,S1,old区使用率都为0,M区使用率大概有17%, 却发生了两次FGC,感觉很诡异,查询原因,发现是CMS Final Remark


查看具体的日志,发现也是一样,old始终为0,新生代也只是一半

jvm metaspace导致FGC_第3张图片


最后尝试了很多方式,决定将MetaspaceSize调大,查看本机默认值,


默认值为21810376 大概是20M,所以我设置为32M,修改后参数如下:

jvm metaspace导致FGC_第4张图片

经过了很长时间的等待,我们发现出现了一次YGC,用时0.127,未出现FGC,正常,但有一个疑惑是,MC开始一直是4480.0(4.375M),后来变成了26496.0(25.875M),仍然没有达到32M的阈值,因此不会触发FGCjvm metaspace导致FGC_第5张图片

查看gc日志,也能对应上,Eden使用完了,进行一次回收,

至于这个MetaspaceSize具体应该设置多少,这个我现在倒还不是很清楚,应该是需要根据自己代码量去具体设置的,如果哪位大神知道应该怎么设置,可以告诉我,我也再尝试尝试,如果发现YGC未发生而直接发生了FGC,这可以考虑适当增大MetaspaceSize的值,还有一个要注意的是,使用netty的时候,不要屏蔽System.gc(),据说会造成不可思议的影响。

你可能感兴趣的:(java)