一直在学习和研究jvm的内存分布和垃圾回收算法及各种垃圾回收器,学过之后决定动手实践一下真实的运用到项目上。
服务器信息:
4核,8G内存,阿里云服务器
tomcat7 ,jdk8,真实运行的项目,测试的地址包含数据库查询和网络访问
压测工具:siege
优化前使用tomcat对jvm内存和垃圾回收器默认设置,仅加了打印gc回收日志的信息配置,在catalina.sh最上面配置,配置信息如下
JAVA_OPTS='-XX:+PrintGCDetails -Xloggc:/var/logs/gc.log'
优化后的tomcat配置了jvm为server,内存为2G,元空间(metaspace)为256M,老年代使用cms垃圾回收器,年轻代垃圾回收器使用默认配置,配置信息如下:
JAVA_OPTS='-server -Xmx2048m -Xms2048m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseConcMarkSweepGC -verbose:gc -XX:+PrintGCDetails -Xloggc:/var/logs/gc.log'
使用siege工具对测试地址进行500同时并发100次循环的操作,连续操作两次命令如下:
siege -c 500 -r 100 http://127.0.0.1:8080/service/manage/tokenInfo.do?uid=H110119
结果总结:
对tomcat的jvm参数设置优化以后,测试同一个地址,平均响应时间变短,并发访问数量增加,fullgc时间明显变短
缺点:使用cms回收器对cpu资源使用比较大,默认使用(cpu数+3)/4个线程来处理