1.一段会导致OOM的代码
Java堆用于存储对象实例,我们只要不断地创建对象,并且保证GC Roots到对象之间可达性路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常
import java.util.ArrayList; import java.util.List; public class OOMTest { public static void main(String[] args) { int i=0; try { String s="hello"; List<String> list=new ArrayList<String>(); while(true){ list.add(s); s=s+s; i++; } }catch (Throwable e){ e.printStackTrace(); System.out.println(i); } } }
2.排查过程
1. javac OOMTest.java
说明:编译出class文件
2. java -Xmx102m -Xms102m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:/memory.hprof OOMTest
说明:
-Xmx102m -Xms102m 设置堆内存最大值,最小值为102m
-XX:+HeapDumpOnOutOfMemoryError 就是当你发生OOM时导出你的堆快照信息
-XX:HeapDumpPath 设置导出的路径
3. jvisualvm
这个可以在你的命令行里敲也可以在你的Jdk包下找
打开我们的VisualVM
装入我们的hprof文件,就可以看到对应信息了
这里就可以看到我们的String占的比例很大
List中也全是String的数据,再个根据出错的行数,不难判断哪里出现了问题
总结:
1.dump出我们的堆的快照信息
2.利用JVisualVM来进行判断哪里出了问题