调优原因:生产服务器4核16g,框架SpringBoot,当压测1小时左右时,出现很多次Full GC,GCT总时间也很大。 jvm启动参数:
-Xms10G -Xmx10G -Xmn3g
jdk1.8默认GC
问题分析:
老年代7G,会发生多次FullGC,说明老年代的内存慢慢上涨,但是不是内存泄漏,因为如果是内存泄漏,FullGC完应该会OOM。所以就分析老年代内存逐渐跑满的原因:
一个对象从Eden区创建,到Survivor区域,逃过15次GC,最终才能到老年代,这种老年代的对象,在FullGC发生时,也基本不会被回收。但是压测过程中出现的现象时老年代满了之后,FullGC会回收很大比例的垃圾对象,说明很多对象没逃过15次GC,直接跑到老年代了,所以接下来分析:什么情况对象会 “直接” 跑到老年代?
1、JVM设置了参数(-XX:PretenureSizeThreshold=1000000),大对象直接进入老年代。
2、Minor GC时,Survivor区域太小。
3、老年代内存本身比较小,Minor GC时,有概率触发Full GC
在笔者这里,情况1、3可以排除。只剩下2。
猜测原因:
UseAdaptiveSizePolicy参数导致Survivor动态调整到过小