前言
很后悔之前没有好好学JVM的相关知识,一知半解,完全没有考虑过JVM性能优化方面。很庆幸刚好有个项目能提供我优化jvm性能。
我负责的案例
一个已上线的,我负责的项目为例子,先说下CPU的大小,2核8G
同时该服务器还运行着三个JAVA项目,每个项目都是JDK1.8环境,每个项目的JVM配置是默认的,没有添加修改,目前网站人数和使用量都不高,但垃圾回收次数就恐怖如斯。
(为什么没用G1回收器,G1在JDK10加强了并发回收器,JDK12增加自动返回堆未使用的内存给系统,G1在JDK12才是完全体,所以先用ParNewGC和CMS)
第一个项目:3天,年轻区回收次数99次,年老区回收3次
第二个项目:4天,年轻区回收次数559次,年老区回收31次
第三个项目 :6天年轻区回收161次,年老区回收3次
为了解决以上问题:
同时还考虑三个项目的占用内存空间的情况,
初步尝试jvm大小设置2048,年轻区启用并行收集器,年老区启用CMS
-server
-Xmx 2048m
-Xms 2048m
-XX:+UseParaNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSFullGCBefore=10
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=256m
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
开启后,观察一天,三个项目的GC回收次数很明显大幅度下降了!!!!!!!!!!!
--------------------------------------------------------------------------------------
第一个项目
3天,年轻区回收次数99次,年老区回收3次
配置后
3天,年轻区回收次数20次,年老区回收1次
--------------------------------------------------------------------------------------
第二个项目
4天,年轻区回收次数559次,年老区回收31次
配置后
4天,年轻区回收次数90次,年老区回收10次
--------------------------------------------------------------------------------------
第三个项目
6天年轻区回收161次,年老区回收3次
配置后
6天年轻区回收50次,年老区0次
--------------------------------------------------------------------------------------
总结:很后悔之前没有好好学习jvm的相关内容,现在配置完,效果拔群
以上配置虽然提升JVM的性能,但相对的导致内存比较紧张,3个项目,每个项目堆内存设置为2G,8G的机子剩余2G,这也是很头痛的地方。
我会继续逐步根据GC日志来进行JVM配置的。
他人的案例
1、一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程
该作者由原先的FullGC 40次/天改为10天才一次,总共经历了两次调优