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中添加这个用户
标签:sir,多测师,对象,回收,session,user,20,杭州 From: https://www.cnblogs.com/xiaoshubass/p/16753471.html