java Dump文件分析

前言

dump文件是java虚拟机内存在某一时间点的快照文件,一般是.hprof文件,下面自己模拟一下本地内存溢出,生成dump文件,然后通过mat工具分析的过程。

配置虚拟机参数

要想本地模拟oom异常,那么建议将堆内存设置的小一点,那样容易触发

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} -Xms20m -Xmx20m
  1. -XX:+HeapDumpOnOutOfMemoryError表示jvm发生oom异常时,自动生成dump文件,文件格式一般是:java_pid20804.hprof ,其中20804是java进程id
  2. -XX:HeapDumpPath=${目录},表示生成dump文件的目录,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof,此步骤实验出了点问题,暂时跳过
  3. -Xms:表示给jvm分配的初始化堆内存
  4. -Xmx:表示最大堆内存

模拟oom异常的程序

public class Test1 {
public static void main(String[] args) {
List<Person> personList = new ArrayList<>();
while (true){
Person person = new Person();
person.setDate(new Date());
person.setAge(20);
person.setName("test");
personList.add(person);
}
}
}

很明显,一直创建Person对象,却又无法释放,很快就内存溢出了。

java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to java_pid21892.hprof ...
Heap dump file created [33907612 bytes in 0.152 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at Test1.main(Test1.java:15)

生成的文件名称是java_pid21892.hprof,在项目的根目录下面,文件大小33.9M

MAT工具分析dump文件

预览

预览界面,能清楚的看到整个堆总内存18.7M,但是有18.3M的内存被一个类的对象占用了

功能介绍

  1. Histogram柱状图:以class类的维度展示每个class类的实例存在的个数、 占用的 [Shallow内存] 和 [Retained内存] 大小,可以分别排序显示,从图中看到,Person类的实例占用内存最大,而它就是没有回收引起内存溢出的对象

  2. Dominator Tree支配树:该视图以实例对象的维度展示当前堆内存中Retained Heap占用最大的对象,以及依赖这些对象存活的对象的树状结构

    展开会展示下一层子节点,可以这么理解:父节点引用了子节点,子节点没有被回收,所以父节点也没法被回收

  3. Thread Overview::可以看到线程栈/线程对象信息

    把线程进行一个排序,同样能看到引起内存溢出的是最上面线程里面的Person对象

  4. 可以选择展示什么样的报告信息,我们最开始打开dump文件时,会弹出一个窗口让我们选择,如果选错了这里可以重新选择

  5. 这里的功能比较强大,主要用来分析GC引用关系,每个对象到GCRoot的引用,可以在柱状图或者支配树界面里选择可疑对象进行分析,比较常用的两个是:Path to GC ROOTS和Merge Shortest Paths to GC Roots,当然选中对象双击,也能进入到这样的界面

  6. Group分组功能:在 Histogram视图 和 Domiantor Tree视图时可操作,即以什么样的维度展示

  7. 将分析报告以什么样的格式导出,可选的有html、csv、txt。便于在团队合作分析dump文件时,无需将庞大的dump文件拷贝过去,只需要生成以上格式的文件,就能很方便的转移。

总结

以上用作笔记,方便下次本人查阅为主。

本地模拟内存溢出并分析Dump文件的更多相关文章

  1. java OOM还在看log日志,兄弟你错的的很严重,正确方式是分析dump文件

    目录 OOM异常--intsmaze 正确姿势dump文件分析--intsmaze 正确的姿势--intsmaze dump丢失打印--intsmaze 哪些内存溢出会产生dump文件--intsma ...

  2. (转)JVM各种内存溢出是否产生dump

    对于java的内存溢出,如果配置-XX:+HeapDumpOnOutOfMemoryError,很明确的知道堆内存溢出时会生成dump文件.但永久代内存溢出不明确是否会生成,今天来做一个实验: 永久代 ...

  3. 使用MAT(Memory Analyzer Tool)工具分析dump文件--转

    原文地址:http://gao-xianglong.iteye.com/blog/2173140?utm_source=tuicool&utm_medium=referral 前言 生产环境中 ...

  4. express 内存溢出问题分析定位

    一.现象 1. 如下报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: n ...

  5. JVM:Java常见内存溢出异常分析

    转载自:http://www.importnew.com/14604.html Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆 ...

  6. [Java基础] 使用JMAP dump及分析dump文件

    转载:http://blog.csdn.net/kevin_luan/article/details/8447896 http://liulinxia02.blog.163.com/blog/stat ...

  7. android 内存溢出问题分析

      最近的项目中,内存一直再增长,但是不知道是什么问题,导致内存溢出,在网上看到了这么一篇关于内存分析与管理的文章,解决了部分问题,感觉这篇文 章还不错,就转帖到我的blog上了,希望对大家有所帮助. ...

  8. Java常见内存溢出异常分析(OutOfMemoryError)

    原文转载自:http://my.oschina.net/sunchp/blog/369412 1.背景知识 1).JVM体系结构 2).JVM运行时数据区 JVM内存结构的相关可以参考: http:/ ...

  9. 记一次内存溢出的分析经历——thrift带给我的痛orz

    说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...

随机推荐

  1. ETCD监控

    Watch key changes Applications can watch on a key or a range of keys to monitor for any updates. Her ...

  2. 判断一个数组是否包含一个指定的值 includes-ES6

    var array1 = [1, 2, 3]; console.log(array1.includes(2));  // trueconsole.log(array1.includes(2, 5)); ...

  3. 【转】centos升级curl版本

    1.安装repo rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/rhel6/x86_64/city-fan.org-release-2-1 ...

  4. 通过python调用jenkins 常用api操作

    # -*- coding: utf-8 -*- import jenkins class TestJenkins(object): def __new__(cls, *args, **kwargs): ...

  5. leetcode 0207

    目录 ✅ 561. 数组拆分 I ✅ 1025. 除数博弈 聪明的数学归纳法: 动态规划又来了(没理解,todo 0207): ✅ 557. 反转字符串中的单词 III py 中的 字符 split ...

  6. PS进程及杀掉进程!

    1.程序和进程的关系(1)程序 保存在硬盘.光盘等介质中的可执行代码和数据 静态保存的代码 (2)进程 在 CPU 及内存中运行的程序代码 动态执行的代码 父.子进程:每一个进程可以创建一个或多个进程 ...

  7. mybatis 无效字符

    只想说 是真的坑啊!!!!!sql就是对 但就是报错无效字符..... 一.sql后有 “:”,我觉得这个应该坑了很多人了 二.标签后有类似于空格的东西(我也不知道是tab还是空格,反正删完就对了) ...

  8. mac 终端连接服务器报错

    今天在连接虚拟机服务器时突然报了一个 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!的错误.  会出现这个错误的原因是在第一次进行SSH连接时,会生 ...

  9. 使用KVO键值监听

    本文章从五个方面介绍KVO(Key-Value-Observer)键值观察者: (1)功能介绍 (2)使用步骤 (3)应用场景 (4)原理理解 (5)相关的面试题 一 功能介绍 KVO是OC语言对「观 ...

  10. C++代码书写规范——给新手程序员的一些建议

    代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码.特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候, ...