看下文前可以先了解一下JVM内存溢出的四种情况
该段代码在无限循环中创建对象
public class OOM {
public static void main(String[] args) {
List<Object> n = new ArrayList<Object>();
while (true) {
n.add(new Object());
}
}
}
执行结果:
那么在无线创建对象时,jvm堆中是否能放的下呢?答案肯定是不能。
那么当代码写的多时,我们不知道具体是因为哪部分导致占用内存被大量占用。那么我们就可以通过Eclipse Memory Analyer这个来分析一下,找到具体位置,再来进行解决。
Eclipse Memory Analyer下载链接https://www.eclipse.org/downloads/download.php?file=/mat/1.8.1/rcp/MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip
即可完成下载
测试前可以先配置一些VM arguments,这样利于我们测试和查找判断
-XX:+HeapDumpOnOutOfMemoryError为导出内存溢出信息(hprof文件)
导出内存溢出信息文件前:
执行类后导出.hprof文件
现在就用对java_pid432.hprof内存溢出信息进行分析一下
蓝色部分为可能出现问题的部分(我们要检查的部分):
对占比例高的这部分进行查看:
这样就可以定位出内存溢出具体发生位置,剩下的就是对代码进行修改和优化了。