本文主要是介绍一、记一次内存泄漏(jmap+jhat)(jmap+MAT),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、问题描述
系统日志显示 RocketMQ相关的异常报错
二、分析
1.RocketMQ的broker进程被干掉了
2.free 查看内存情况,发现 buff/cache 2G,这个缓存不正常
3.检查 RocketMQ配置的内存大小,1G,配置正常
4.检查Karaf占用内存,ps -ef | grep karaf ,800M,正常
三、解决
尝试方案一:清除buff/cache
echo 3 > /proc/sys/vm/drop_caches
结果不理想,buff/cache 大小几乎没减少,只清除掉几M
尝试方案二:检查Java内存泄漏
1、导出内存快照
方式很多,使用JDK自带的工具jmap导出
jmap -dump:format=b,file=/opt/dump_0317.hprof 26783
2、分析内存快照
2.1使用JDK自带的工具jhat分析
jhat -J-Xmx1024M /opt/dump_0317
2.2、使用MAT工具分析
1)导入快照
2)查看内存泄漏概况
2)查看内存泄漏疑点1的细节
找到一个自己定义的类,重点分析它
查看一下 GCRoots
发现session有问题
结合代码进行分析,发现session永不过期,问题找到。修复:
1、接口被大量恶意请求时,会在服务器生成大量session
解决:服务器收到请求时,并不创建session。
1)确认登陆成功后,创建session
2)请求携带合法token时,若session为空,创建session
2、session失效时间
从最后一次访问起,5分钟销毁。
这篇关于一、记一次内存泄漏(jmap+jhat)(jmap+MAT)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!