当前位置:网站首页 > Java教程 > 正文

java mat教程



设置启动参数,最大内存为4m,并且自动转储Heap Dump:,IDEA这么设置:

在这里插入图片描述

运行程序之后很快抛出了OOM,并且自动生成了Heap Dump文件:

在这里插入图片描述

默认位置在项目目录下面:

在这里插入图片描述

下面开始分析!

双击文件,打开:

在这里插入图片描述

点击File,Open Heap即可选择一个Heap Dump文件,我们选择刚才生成的文件。

在这里插入图片描述

选择打开的模式,我们选择第一个模式,即用于分析内存泄漏,点击Finish即可打Heap Dump文件:

在这里插入图片描述

常见选项的含义:

  1. :内存泄漏可疑点报告,自动检查堆转储是否存在泄漏嫌疑,报告哪些对象被保存起来,为什么它们没有被垃圾收集,。
  2. : 元件报告,分析一组对象是否存在可疑的内存问题:重复的字符串、空集合、终结器、弱引用等。
  3. : 打开以前的运行报告;

Dump文件越大,打开的时间就越长,打开之后,OverView界面如下,Overview视图,显示了此份Dump文件的概要的信息,并展示了MAT常用的一些功能:

在这里插入图片描述

  1. :显示了一些统计信息,包括HeapDump的大小、类(Class)的数量、对象(Object)的数量、类加载器(Class Loader)的数量。
  2. :以饼图的方式直观地显示了在dump中最大的几个对象,当鼠标光标移到某块区域的时候会在左边和窗口中显示详细的信息,在区块上点击左键可以通过菜单获取更详细的信息。
  3. :几种常用到的操作,包括。
  4. :列出了常用的报告信息,包括和。
  5. :以向导的方式逐步的引导使用功能,包括。

下面我们来看看其他常用的功能。

Histogram直方图,用于展示每个类型的实例的数量,以及 shallow size 和 retained size :

  1. :浅堆,代表了对象本身的内存占用,包括对象自身的内存占用,以及“为了引用”其他对象所占用的内存。
  2. 非数组类型的对象的 shallow heap=对象头+各成员变量大小之和+对齐填充。其中,各成员变量大小之和就是实例数据,如果存在继承的情况,需要包括父类成员变量
  3. 数组类型的对象的shallow heap=对象头+类型变量大小*数组长度+对齐填充,如果是引用类型,则是四字节或者八字节(64 位系统),如果是 boolean 类型,则是一个字节。这里类型变量大小*数组长度就是数组实例数据,强调是变量不实际是对象本身。
  4. :深堆,一个统计结果,会循环计算引用的具体对象所占用的内存。但是深堆和“对象大小”有一点不同,深堆指的是一个对象被垃圾回收后,能够释放的内存大小,这些被释放的对象集合,叫做保留集(Retained Set)。

在这里插入图片描述

当右键单击任何对象时,将看到下拉菜单,如果选择“ListObjects”菜单项,可以查看对象的outgoing reference(对象的引出)和incoming reference(对象的引入)。

在这里插入图片描述

Incomming Reference 指的是引用当前对象的对象,Outgoing Reference 指的是当前对象引用的对象。对象的incomming reference 保证对象处于 alive 从而免于被垃圾回收掉 ;Outgoing reference 则展示了对象内部的具体内容,有助于我们分析对象的属性 。

我们看看第一个最大的char[]的Incomming Reference:

在这里插入图片描述

可以看到,它们几乎都是被一个String对象的value属性引用的,实际上这个String就是我们拼接的UUID字符串。

列出Heap Dump中处于活跃状态中的最大的几个对象,默认按 retained size进行排序,因此很容易找到占用内存最多的对象。

排在第一的最大的对象就是占用内存最多的对象,它在树中的子节点都是被该对象直接或间接引用的对象(这意味着当这个对象被回收的时候它的子节点对象也会被回收)。

一般定位OOM的时候,都是直接查看支配树的最大的对象,我们的Heap Dump中的支配树中,很明显ArrayList占用了最大的内存,里面的元素就是一个个拼接的UUID字符串,就是因为这个原因导致了OOM。

在这里插入图片描述

点击上面的黄色齿轮,可以生成Heap Dump文件的时候线程视图Thread Overview,查看线程的运行情况,抛出的异常的分析。

在这里插入图片描述

我们的Heap Dump中的Thread Overview,结果如下,很明显OutOfMemoryError是由main线程抛出的:

在这里插入图片描述

MAT会分析 Heap Dump 文件并检测内存泄漏的可能,比如一个或一组异常大的对象 。Leak Suspects用于生成内存泄漏嫌疑分析报告,非常有用,能够帮组我们快速的定位OOM的原因。

查看我们的Heap Dump中的Thread Overview,结果如下,如果此前的几项你还不确定OOM的原因的话,那么这里可以说直接告诉你原因了:

在这里插入图片描述

可以看到,有66.79%的内存由Object[]数组占有,所以比较可疑,这是非常有可能出现内存溢出的。点击Details查看详情:

在这里插入图片描述

可以看到集合中存储了大量的UUID字符串。实际上这里已经告诉我们是不是因此导致的内存溢出了,我们在details详情的最下面可以看到:

在这里插入图片描述

就是这个大对象数组(list集合使用数组存放的元素),因为需要分配连续的内存,而内存不足导致的OOM。

至此,分析完毕!

  • 上一篇: 后端java 代码教程
  • 下一篇: java adt教程6
  • 版权声明


    相关文章:

  • 后端java 代码教程2025-03-13 11:10:00
  • java详细教程视频2025-03-13 11:10:00
  • java后端连载教程2025-03-13 11:10:00
  • java文本编程教程2025-03-13 11:10:00
  • java教程在线编码2025-03-13 11:10:00
  • java adt教程62025-03-13 11:10:00
  • 马士兵老师java教程2025-03-13 11:10:00
  • 魔乐java教程2025-03-13 11:10:00
  • java cad 教程视频2025-03-13 11:10:00
  • java工程基础教程2025-03-13 11:10:00