内存泄露案例分析
内存泄漏案例分析
一.环境配置
1.创建jmter脚本
Ip:10.196.130.103
Port:8082
url:/pinter/case/memory
query: userName=admin&password=1234
2.jmeter添加监控三方插件
下载地址:http://jmeter-plugins.org/downloads/all
Jar包放jmeter中lib/ext目录
下载插件:
3 Basic Graph:windows下可用的实时tps和响应时间的插件
Custom JMeter Functions
Random CSV Data Set Config
PerfMon :服务端性能实时监控插件
二.监控工具
1.jmeter工具
2.jstat命令
Jstat –gcutil 72800 100
3.jvisualvm工具
三.内存泄漏表现
1.现象一:通过jmeter插件可以看到,tps一直下降,RT一直上升
Tps逐渐下降,降至0
Rt相应时间一直上升
2.现象二:通过jstat查看,old老年代一直是100%,fgc次数一直上涨
Old老年代一直处于100%
Fugc一直上涨
3.现象三:Jvisualvm内存一直上涨,最后变成一条曲线
四.判断是否为内存泄漏
查看日志是否有内存溢出OutOfMemoryError的报错
cd /usr/src/tomcat-pinter/logs
tail -100 catalina.out
五.排查思路
1.可以忽略的对象:
数据类型相关的不用管:[B Byte [C Char [I int
Java开头的不用管:属于底层对象
2.重点关注的对象:
业务相关:一般以com/cn开头
框架相关:org开头三方框架
六、定位问题方法
1.通过jmap命令定位问题
通过jmap命令打印出暂用内存前30的对象
Jmap –histo 72800 | head -30
2通过jvisualvm工具定位问题
2.1点击堆dump下载到服务器显示的目录
2.2在远程服务器给对应的文件授权
chmod 777 /usr/src/tomcat-pinter/temp/heapdump-1671609652793.hprof
2.3下载文件到桌面
2.4.通过jvisualvm打开文件
右上角文件-装入-堆-文件
2.5.定位问题
通过大小排序查看
七、源码分析
1.根据打印的路径找到项目对应的目录
2.通过sz或者ftxp下载到本地
3.利用jd.gui工具查看源码
Jd.gui官网地址:http://java-decompiler.github.io/
4.分析源码
代码逻辑问题:每次有用户登录,就会去写入session,没有判断用户已经登录,存在session数据