【JVM】记一次JVM调优经历
【本文图片别放大,放大就模糊,我电脑本地没事,传上去就这样。哎!抱歉了!】
事出起因,通过grafana查看Jvm运行情况。
发现每分钟GC次数频繁,而且主要是ParNew GC,通过查资料,发现该垃圾收集器对应JVM 堆的新生代。
通过Arthas查一下内存分配情况。
可以看到堆内存一共分配了4G。
然后新生代(eden + survivor)和老年代(cms)分配比例接近:1 : 3
多执行几次 memory 命令试试,果然发现了重大问题。
eden 使用率频繁从20%多到90%多,再到20%多,再到90%,这无疑印证了再频繁进行ParNew GC。
很明显是由于新生代内存空间不足,然而又不断在新生代分配对象导致的。
看了,一下pod 的内存limit上限可是8g啊,怎么Jvm堆内存才分配4G。
-Xms1024m
-Xmx4096m (堆最大内存)
-Xmn512m (新生代大小)
-Xss2048K
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
这是妥妥的浪费啊,推测可能是历史原因,最开始每个Pod可能就4g内存,后来开发人员发现内存不足,便申请提升内存至8g,可是后来忘了修改jvm的堆内存大小,相当于白申请了~
给它改一下吧。
-Xms1024m
-Xmx6144m (堆分配6g)
-Xmn2048m (新生代2g,也就是老年代 4g,比例为:1:2)
-Xss512K
-XX:MetaspaceSize=128m
大概画了一下JVM内存分配图。
运行一段时间了,看看效果,emm....,果然降低不少啊!
思考:为什么我们的开发人员一直都没有去关注过这件事呢?
作者:Coinker
来源链接:https://blog.csdn.net/csp_6666/article/details/124764048