java模拟内存溢出并分析_本地模拟内存溢出并分析Dump文件

【官方正版】cmos模拟清华大学电路

71.2元

(需用券)

去购买 >

fe5148c614eb51246b9349956ec579aa.png

java Dump文件分析

前言

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

配置虚拟机参数

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

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录} -Xms20m -Xmx20m

-XX:+HeapDumpOnOutOfMemoryError表示jvm发生oom异常时,自动生成dump文件,文件格式一般是:java_pid20804.hprof ,其中20804是java进程id

-XX:HeapDumpPath=${目录},表示生成dump文件的目录,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof,此步骤实验出了点问题,暂时跳过

-Xms:表示给jvm分配的初始化堆内存

-Xmx:表示最大堆内存

模拟oom异常的程序

public class Test1 {

public static void main(String[] args) {

List 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的内存被一个类的对象占用了

21ca1619ef8c54087510a382c09fdc5f.png

功能介绍

afd212c4738b320d090e65412ab8ccd4.png

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

76e31c29f8ef1bdbba6c6b6670615870.png

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

4713eabd08b48d3f7911634a621204e2.png

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

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

4d287e3f5dc6277fb031778545156d10.png

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

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

e85f12ce52d1bf316670694d2e70ec3b.png

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

4713eabd08b48d3f7911634a621204e2.png

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

b43edbed358e97bc2c63fcb4285403c8.png

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

总结

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

原文链接:https://www.cnblogs.com/xiaoming0601/p/12268753.html

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值