问题,在生产环境中,发现很多应用在启动的时候,就会出现几次fullgc,但是在gc.log中并未发现相应的fullgc日志。应用也能正常启动成功。
- 应用分配了4G内存;
- 镜像为openjdk8;
-
jvm参数为:
-Xms2688m
-Xmx2688m
-Xloggc:/**/gc.log
-XX:NewSize=900m
-XX:MaxNewSize=900m
-XX:+UseConcMarkSweepGC
-XX:CMSFullGCsBeforeCompaction=5
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSParallelRemarkEnabled
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-verbose:gc
-XX:+PrintClassHistogramBeforeFullGC
-XX:+PrintClassHistogramAfterFullGC
-XX:+PrintCommandLineFlags
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintTenuringDistribution
-XX:+PrintHeapAtGC
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+DisableExplicitGC
-XX:+UseCompressedOops
-XX:+DoEscapeAnalysis
-XX:MaxTenuringThreshold=10
现象:在启动成功后通过jstat查询,多次发现都有4次fullgc,如图所示:
因为应用能成功部署,并正常访问等情况,可以判断发现堆内存等分配都是比较正常,并且gc日志并未找到相关的fullgc日志。
经过度娘和谷歌等,并未找到直接类似的答案,但是注意到openjdk8新增了元空间,而且元空间默认大小为21M,对于一个比较大的应用,空间不足导致fullgc,然后动态扩展了几次,为了验证下猜想,新增了元空间的默认大小设置:-XX:MetaspaceSize=200M,然后部署成功,并jstat查询:
验证了猜想。