36-电子发票查询接口-TPS波动较大-典型的性能问题-内存溢出

来源:互联网 发布:校音器软件下载 编辑:程序博客网 时间:2024/04/28 12:21

2 电子发票查询接口TPS波动较大
2.1 问题描述
电子发票查询接口,2000Vuser并发下,TPS波动较大并且在2分钟后直降为0。如下图:
这里写图片描述
2.2 定位思路
2.2.1 步骤一:典型的内存溢出
Jconsole工具查看内存回收情况。发现老生代,在短短的10分钟左右时间内存,FGC长达3分钟。一般情况下,1小时稳定测试中,FGC时间不会超过3分钟。
这里写图片描述
2.2.2 步骤二:查看GC情况
查看GC情况:jstat -gc 30129 5000 ,主要关注FGCT(FGC的总时间)和FGC(FGC的次数)。FGC为FullGC的次数,由下图可知,FullGC的次数不断增加。
这里写图片描述
2.2.3 步骤三:DUMP出内存快照
jmap -dump:live,file=1865.map 1865,DUMP出内存中存活的对象。
MemoryAnalyzer工具,分析DUMP出来的内存快照。发现如下图红框中,有1个多G的Session对象存活在内存中。导致的内存老生代的溢出。
这里写图片描述

2.3 解决办法
当前测试的这个电子发票查询接口,用户通过订单号,查询发票详情,也就是PDF文件。当2000Vuser并发时,TPS约为7000左右。也就是有百万级的Session存活在内存中。导致内存溢出。
解决办法是:请求成功之后,会立即跳转pdf页面,在那将session失效,这里就不受session失效时间控制了。
session.invalidate这一步会在请求成功后的下一步进行操作的。相关代码:
这里写图片描述
通过分析,是因为高并发的场景下session过多导致内存溢出。发现tomcat的1分钟失效时间并不足够;
解决方法: 对于我们发票查询系统,查完下载pdf之后,session就无作用,就可以立即释放session
我们在预览pdf之后,立即执行session.invalidate()将session立即失效。这样可解决内存溢出问题,最终tps稳定在4000左右.
2.4 最终TPS
这里写图片描述
2.5 优化后的JVM内存回收情况
这里写图片描述

1 0
原创粉丝点击