一、结论
JDK8 因未指定 MetaSpace 大小,程序启动过程中元空间不够用,触发 full gc。
详细如下:
JDK8 因未指定 MetaSpace 大小,默认初始大小约 21M
程序启动,元空间大小占用稳定在 90M
因为超过了默认元空间大小,导致元空间扩容(每次扩容会 full gc)
从 GC 日志来看,每次元空间扩容都是增加 20M 左右,所以程序启动时 full gc 4 次
二、问题
应用启动时出现 full gc;
gc日志重点:GC (Metadata GC Threshold) [PSYoungGen: 354024K->15340K(1376256K)
三、排查过程
启动过程中,出现了 JVM Full GC 告警。
由于启动过程中之前没有遇到这种情况,找不到其它原因。
于是修改 JVM 参数,增加 GC 日志,于是就看到了『二』中的内容。
看原因是元空间内存不够大导致的
通过 GC 日志可以看到元空间实际占用大小,100M
于是调整 JVM 元空间大小至 128M,问题解决。
问题是解决了,但是原因是什么呢?
在结论部分已经讲了,这里不重复。
所谓知其然,更要知其所以然。
只有这样才能明白问题的本质,学到知识。