JVM -- 分析Dump文件定位OOM问题

一、目标
此文目的有二:1、学习如何去获取dump文件;2、如何通过分析dump文件定位程序中发生OOM之处。

二、准备工作
1、JVM参数设置:-XX:+HeapDumpOnOutOfMemoryError,即让程序遇到OOM时自动生成一份dump文件。
2、程序很简单:

    public  static void main(String[] args){
        List list = new ArrayList();
        while (true){
            list.add(2048*1024*2048);
            list.add("为了撑爆内存也是没办法啦~");
        }
    }

3、结果:

1510368156143.jpg

三、结果分析(jvisualvm)
dump分析工具有很多,但是适合MAC的比较少,但是有一款JDK自带的工具非常好用:jvisualvm。
直接在Iteam输入jvisualvm即可启动该工具,启动后页面如下:


1510368618330.jpg

然后再入dump文件(默认在当前目录,也就是工程目录下):


1510368871069.jpg

文件中首先展现的是各种基本信息,然后找到关键点--堆转储上的线程信息:


1510369012599.jpg

从里面可以清楚的获取到发生OOM的位置:首先发生OOM的线程是主线程“main”,最外com.egov.test.DumpMain.main(DumpMain.java:16),然后具体是java.util.ArrayList.add(ArrayList.java:458)
在添加对象时内存溢出。。。一层一层往内走,最终发现是在扩容时 java.util.Arrays.copyOf(Arrays.java:3210)

发生了OOM错误。

通过分析,我门准确定位到了错误发生的地方,接下来是猿们自己改逻辑代码了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,975评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 参数设置 在Java虚拟机的参数中,有3种表示方法用“ps -ef |grep "java"命令,可以得到当前Ja...
    九问阅读 9,180评论 2 52
  • 两千多年的等待, 两千多年的盼望 两千多年的呼喊 两千多年的渴望 换来的是一个 决心 光芒千万丈 新世纪的来临 人...
    一心居士阅读 195评论 0 0
  • 岁末年初,无论身在职场,还是家庭,都值得给自己留出一点时间,为自己做一个年终总结。 年终总结的本质,是让我们从另外...
    雪姨来了阅读 2,125评论 0 1