记录一次jvm调优问题,GC (Metadata GC Threshold) ,GC (System.gc())

今天在优化项目的jvm参数时发现了一个很奇怪的问题,在这里记录下

最开始的参数

-Xms2g -Xmx2g -XX:SurvivorRatio=2 -XX:NewRatio=1 -Xloggc:gc.log -XX:PretenureSizeThreshold=209715200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump

记录一次jvm调优问题,GC (Metadata GC Threshold) ,GC (System.gc())

 可以看到程序跑了一会儿之后连续触发了两次full gc但是明显不满足条件 内存是够用的,于是看了下gc日志如下

记录一次jvm调优问题,GC (Metadata GC Threshold) ,GC (System.gc())

可以看到最开始就触发了元空间的 垃圾回收,经查资料发现是没有设置元空间的初始大小,所以使用默认的20M 导致触发了fullgc

于是加上-XX:MetaspaceSize=265M的参数,现在配置如下

-Xms2g -Xmx2g -XX:MetaspaceSize=265M -XX:SurvivorRatio=2 -XX:NewRatio=1 -Xloggc:gc.log -XX:PretenureSizeThreshold=200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump
这样配置跑一段时间是没有触发full gc ,但是过了一段时间又连续触发了两次

记录一次jvm调优问题,GC (Metadata GC Threshold) ,GC (System.gc())

 可以看到在进行13次young gc之后又连续触发两次,于是继续看gc日志

记录一次jvm调优问题,GC (Metadata GC Threshold) ,GC (System.gc())

发现有手动触发gc的操作,通过-XX:+DisableExplicitGC关掉手动触发的gc

配置如下

-Xms2g -Xmx2g -XX:+DisableExplicitGC -XX:MetaspaceSize=265M -XX:SurvivorRatio=2 -XX:NewRatio=1 -Xloggc:gc.log -XX:PretenureSizeThreshold=200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump

经过这次改动后再没有触发过full gc 问题解决,不过还是没有找到哪里的代码手动触发的gc。。。 有大佬知道方法可以告诉我下