要快速定位无非就三步:dump内存文件,内存分析工具生成内存泄露分析报告,根据报告到代码中分析相关代码;
1.dump内存文件
./jmap -dump:format=b,file=heap.hprof pid2.内存分析
常用的内存分析工具如:MemoryAnalyzer,jprofiler;工具会帮助我们快速的生成一份内存泄露分析报告,大致如下所示:
可以根据上面的问题描述去相关代码中,然后进行代码分析;
3.代码分析
在代码分析之前,我们大概理一下都会有哪些情况出现OOM;大体上可以分为几类类情况:JVM本身分配的内存过小,分配的内存不小代码可优化,分配的内存不小存在内存泄漏;
1.JVM本身分配的内存过小
这种情况一般比较少见,一般配置内存至少1G内存以上;常见的比如查询数据库几十条,上百条数据内存就不够用了,加内存可以立马能解决问题的;
2.分配的内存不小代码可优化
这种问题就比较常见了,内存本身配置的并不小,但是出现OOM;
常见的比如以下查出几千上万条数据库记录,导致内存不够用,这种情况可以分批次查询;
本地缓存,但是没有提供清除策略,导致内存越来越大,这时候需要指定清除策略比如lru策略;
导入一个文件比如excel,一下全部加载到内存中,导致内存OOM,这时候可以换一种读取的方式,通过流读取方式;
3.分配的内存不小存在内存泄漏
这种问题就比较难发现了,开发者任务应该清除的内存并没有清除,一直存在内存中,导致数据越积越多,最终导致内存OOM;常见的比如hashset因为修改计算hash值的数据导致内存泄漏;