通过JProfiler来分析内存泄漏(OOM)问题
OOM介绍
- OOM 是 “Out Of Memory”的简写,即内存耗尽。
- 当 JVM 因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误。
- 导致OOM的原因有多种,主要为内存分配过少和代码漏洞。
定位OOM
昨天项目还很健康,今天就病了,肯定是别人下毒,这种说法是不对的。
既然OOM已经发生了,那就查查是什么原因导致了这个问题。
首先bug的定位,程序员第一时间肯定想到的查看报错日志,download日志之后,如果运气好,报错的地方刚好就是导致OOM的代码,那么恭喜你,请修复他。
但是如果日志内的报错指向了很多的业务代码,甚至没有指向,那么日志就失去了作用,这时候,我们要首先去看看JVM分配的大小,之前分配的大小也许够之前用,但是增加了业务逻辑,或者遇到了高并发场景,内存的使用就上去了,以前申请的JVM内存大小可就不够用了。
增加了JVM内存大小之后,发现还是会频繁溢出,那这就是代码出了问题,既然日志已经定位不了了,那我们上工具吧。
JProfiler安装
官方网址:https://www.ej-technologies.com/download/jprofiler/version_92
IDEA启动JProfiler
- setting>>Plugins 市场搜索JProfiler
- 安装之后,重启IDEA,可通过Profiler启动项目,对项目进行监控
分析服务器上的内存溢出
- 项目启动命令添加OOM的堆栈日志输出
nohup java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/java/project/idv
- 发生OOM时会向指定文件夹输出.hprof快照文件,文件大小为启动项目时设置的堆内存大小
- 下载快照文件至本地,通过JProfiler打开
- 经过一段时间的解析,界面如下分析
- 双击第一个非基本数据类型的对象
- 查看这个对象集的合并的传入引用
- 部分引用可以很快递归追溯到出问题的代码
- 在项目中搜索堆栈日志内比较独特的对象,也可以定位大概是什么功能导致OOM