一、问题描述
系统日志显示 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分钟销毁。