性能测试内存溢出bug的定位和分析【杭州多测师】【杭州多测师_王sir】

1、通过jmeter -n -t case.jmx在服务器端设置20个并发和持续300秒进行压测

2、通过jstat -gcutil 进程号 命令来监控服务器年轻代、老年代、新生代的垃圾回收情况

3、发现年轻代的S0和S1一直在处于交换的情况、O老年代一直处于上升的过程、后续新生代回收的频率越来越快、最终基本上都达到100%

4、通过在Linux端用jmap histo 进程号|head -20 命令查看垃圾回收最频繁的前20个对象发现User类、char[]、byte[]、Session类的这几个对象占用了差不多80多兆

因为堆内存总共设置的为256M

5、在桌面下载一个Java的反编译工具JD-gui然后从服务器上面部署的项目中找到User类对应的class文件、拖动到jd-gui工具里面发现每次发接口请求的

时候都会通过HttpSession session = request.getSession()创建一个session对象、还有每次去判断的时候如果没有用户会重新创建一个用户放在list集合里面

这样就导致session里面存了很多个user对象有几十万个

6、而且session对象还不能被jvm进行垃圾回收、因为session对象是比较特殊的

 

 7、session类不能被回收、但是user是存在session里面的、session不能被回收导致user也不能被回收、出现了逻辑上的错误

8、然后去Tomcat看日志已经出现了:sessionStatMap is full和outofmemory的错误

9、解决的办法就是改一下代码:

当session中已经有这个用户的时候、就不要再往session中添加这个用户

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值