dump 内存溢出分析

MAT内存溢出分析

元素介绍

List objects下面有两个选项
with outgoing references:这个对象引用了那些对象。
with incoming references:这个对象被那些对象引用。

MAT设置

  1. Shallow Heap、Retained Heap单位不显示,无法直观的查看,比较麻烦,我们可以设置单位显示。

  2. 有时候dump文件很大,但是后发现实际的对象大小并不大,这时候可能是因为有部分unreachable objects(不可达)对象没有统计进来。注意:勾选后,需要重新打开dump文件。

Overview

提供有关堆转储文件整体情况的概览信息,如堆大小、对象数量等。

Histogram

显示了不同类别对象的数量和占用内存大小,帮助你了解哪些对象占用了大量内存。

Dominator Tree

显示了占用最多内存的对象及其引用关系,帮助你找到内存占用较高的对象和潜在的内存泄漏问题。

Leak Suspects

根据对象引用关系和垃圾回收信息,提供了可能导致内存泄漏的对象列表。

分析步骤

  1. 打开文件后,直接点击Leak Suspects会自动分析内存泄露的可疑对象。
  2. 分析完成会看到可疑信息,直接点击Details,看看是那些对象。
  3. 这时候看到可疑的对象,我们可以看看这些可以对象引用哪里对象(with outgoing references)来确定对象里存储的都是什么。
  4. 可以看到我们这里是非常多的HashMap,然后里面存储的对象如下图,这时根据业务场景,去代码里面找相关代码点。
  5. 在代码里面搜索后发现下面代码,然后点击new转到定义,发现调用的竟然是有参的构造函数。 xxxMap.computeIfAbsent(xxxPo.getId(), ArrayList::new);
  6. 继续看computeIfAbsent源码,发现会将key传递进去。
  7. 那么结果出来了,key数字较大,导致创建大量容量大的HashMap,对象且没有引用,由于对象较大,因此直接进入老年代,回收也较困难,最终内存占用大,GC回收吃力。

Visual VM排查

  1. dump文件导入后,我们直接选择Objects,查看有那些大对象。

  2. 然后点击size排序后,展开想看对象,看看里面都有什么对象内容,一般都直接看内存占用最大的里面存放的对象即可。

  3. 也可以直接根据Instances进行聚合统计查看那个对象多,以及在items查看里面有那些对象,再哪里引用的。

idea自带的dump分析工具

  1. 首先打开dump文件。
  2. 根据shallow排序,找到最大的对象,双击点进去。
  3. 查看前几个对象,默认将最大排序在最上面的,就可以看到里面存放的内容。
  4. 可以看到这个对象被那些对象引用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章