OOM排查

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 设置导出的路径

OOM排查_第1张图片

3. jvisualvm

这个可以在你的命令行里敲也可以在你的Jdk包下找

OOM排查_第2张图片

 

 打开我们的VisualVM

装入我们的hprof文件,就可以看到对应信息了

OOM排查_第3张图片

OOM排查_第4张图片

 OOM排查_第5张图片

 OOM排查_第6张图片

 这里就可以看到我们的String占的比例很大

OOM排查_第7张图片

 List中也全是String的数据,再个根据出错的行数,不难判断哪里出现了问题

 OOM排查_第8张图片

 总结:

1.dump出我们的堆的快照信息

2.利用JVisualVM来进行判断哪里出了问题

你可能感兴趣的:(OOM排查)