内存泄露
- 内存使用率在90%以上,通过监控工具apm查看到一台虚拟机上应用频繁在发生了全局GC(FullGC),导致应用假死,不在接受请求。此时登录虚拟机
- 通过jmap命令获取内存使用情况
ps -ef | grep appName,获取进程ID
/usr/local/jdk/bin/jmap -dump:format=b,file=m.hprof pid(进程号) - 使用mat分析dump文件
参考资料:https://blog.youkuaiyun.com/alli0968/article/details/52460008
栈溢出
- 现象:一个后端服务,每天都出现进程死掉。并且部署了该应用的后端服务都发生过进程死掉,通过监控apm发现,每次进程挂掉时间都是凌晨2点。
- 分析:每台服务器都发生过,且发生时间都是凌晨2点,说明进程死掉和虚拟机关系不大,有可能是定时任务。查看/var/log/message系统日志,除了看到进程挂掉时间,没有其他有用日志。
- 问题定位:ulimit 它是一种简单并且有效的实现资源限制的方式,修改ulimit值为无限大,用于问题定位。第二天,进程又出现挂掉,查看/var/log/message系统日志,看到里面出现stack over flow即栈溢出,结合发生时间,基本可以确定是定时任务导致。当时定时任务在进行数据归档,根据最近几天归档的数据发现都是归档完成第42条数据后,进程死掉。应该是第43条数据归档出现了问题,模拟现网环境数据,本地运行出现了stack over flow,发现是一个递归函数无法退出导致。