1 .导致oom的代码
Java堆用于存储对象实例。 如果不断创建对象,并确保GC Roots到对象的可用路径,从而避免垃圾回收机制清除这些对象,则在对象数达到最大堆容量限制后会发生内存溢出异常
import java.util.ArrayList;
import java.util.List; publicclassoomtest { publicstaticvoidmain (字符串[ ] args ) {int i=0;
try {
字符串s=' hello ';
列表列表=new ArrayList (; while (真)。
list.add(s;
s=s s;
I;
}
} catch (可移植e ) {
e .打印堆栈跟踪(;
system.out.println(I;
}
}
}
2 .故障排除过程
1. javac OOMTest.java
说明:编译class文件
2.Java-xmx 102 m-xms 102 m-xx : heapdumponoutofmemoryerror-xx : heap dump path=e :/memory.hprofomtest
说明:
-Xmx102m -Xms102m设置堆内存的最大值,最小值为102m
- xx : heapdumponoutofmemoryerror是在dddxt发生OOM时导出您的堆快照信息
-XX:HeapDumpPath设置导出的路径
3. jvisualvm
这个可以在命令行上敲,也可以在Jdk包下找
打开我们的VisualVM虚拟机
导入我们的hprof文件后,可以看到对应的信息
在这里,你可以看到我们的String所占的比例很大
List也包含字符串数据,而且根据错误的行数,判断哪里出了问题并不容易
总结:
1.dump给出我们堆的快照信息
利用JVisualVM,判断哪里出了问题