[转帖]Eclipse MAT 内存分析工具

eclipse,mat,内存,分析,工具 · 浏览次数 : 0

小编点评

**分析步骤:** 1. 下载并安装 MAT 软件。 2. 从官网下载对应的软件压缩包。 3. 启动 MAT 软件。 4. 选择要分析的 Java 进程。 5. 启动 MAT 的“堆内存分析”。 6. MAT 会生成一个堆内存快照文件。 7. 打开堆内存快照文件。 8. 选择要查看的分析类型。 9. 查看对象的大小、引用对象的大小等信息。 **深入分析:** * 深入堆:计算该对象所包含的引用对象的深堆大小。 * 支配树视图:可视化对象实例之间的支配关系。 **注意:** * MAT 需要系统的 Java 版本在 11 及以上。 * 新版本的 MAT 增加了独立的 MAT 支持,无需额外安装 Eclipse 也可以使用 MAT。 * 在打开堆内存快照后,可以选择将其解压并进行分析。

正文

Exlipse MAT 是一款强大的 Java 堆内存分析工具,我们可以通过该工具实现对 Java 堆内存的分析。
官网。实现查找内存泄漏以及查看内存消耗的情况。

MAT 使用

首先去官网下载对应的软件压缩包,下载地址。MAT 提供了多种平台的软件包支持,包括 Windows , Mac OSX ,Linux 等,可以根据你当前的系统进行下载。由于我使用的是 Win10,因此下载了 Windows(x86_64)版本的。
在这里插入图片描述
需要注意的是新版的 MAT 需要系统的 Java 版本在 11 及以上,如果你的版本不够,则需要重新配置一下环境中的 Java 版本。
在这里插入图片描述
对于老版的 MAT,是作为一个 Eclipse IDE 插件提供的,新版的 MAT 增加了独立的 MAT 支持,使得用户不需要额外安装 Eclipse 也可以使用 MAT。

初识 MAT

在分析堆快照之前,首先需要导出应用程序的堆快照。我们可以使用 jmapjconsoleJava Visual VM实现堆快照的导出。除此之外使用 MAT 也能够实现堆快照的导出。
单击左上角的File菜单下的Accquire Heap Dump 选项,选择对应正在运行的 Java 进程即可。
在这里插入图片描述

解析 dump 出的堆内存快照

除了直接在 MAT 中获取正在运行的应用程序的堆快照之外,也可以通过 “Open Heap Dump” 来打开一个本地的堆快照。

建议将堆内存快照文件单独放在一个文件夹下,因为 MAT 在分析堆内存快照的时候会在对应目录下生成一些索引文件,因此将堆内存快照单独放在一个文件夹下便于查看。

在这里插入图片描述
在打开堆快照后,会出现如下的界面:
在这里插入图片描述
可以根据界面的指引选择你想用的功能即可。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

浅堆(Shallow heap)和深堆(Retained Heap)

在 MAT 中会发现有两列分别描述了对象的浅堆(Shallow heap) 和深堆(Retained Heap)。这两列都是用于描述对象的大小,以 java.lang.String为例:
在这里插入图片描述
可以发现这里 java.lang.String 的浅堆大小都是 24 字节,而深堆大小与具体对象有关,各不相同。

  • 浅堆(Shallow Heap) 用于描述一个对象结构所占用的内存大小
  • 深堆(Retained Heap) 用于描述一个对象被 GC 后,可以释放的真实内存的大小。

浅堆(Shallow Heap)

浅堆是指一个对象所消耗的内存。
浅堆的大小只与对象的结构有关,与对象的实际内容无关,也就是说在一个 Java 进程块中,相同类型的所有对象,浅堆的大小是固定不变的。

在这里插入图片描述

在32 位操作系统 和 64 位操作系统上,一个对象所占用的内存大小也各不相同,但基本数据类型所占用的内存大小是不变的,如下:

基本数据类型所占内存大小(字节)
byte1
short2
int4
long8
float4
double8
char2
boolean1

有区别的是引用类型,主要是和 CPU 的字长有关。

  • 在 32 位操作系统上,一个对象引用占 4 个字节(4x8=32)
  • 在 64 为操作系统上,一个对象引用占 8 个字节(8x8=64)

引用类型实际上就是一个地址指针。在 32 位操作系统上,占用 4字节(4x8=32),在 64位操作系统上,占用 8 字节(8x8=64)。

在 JDK1.6 之后,默认开启了指针压缩(-XX:UseCompressedOops),则64位操作系统上地址指针占用 4字节。

而对于对象,对象头在不同的操作系统上大小也不同。

  • 在 32 位操作系统上,一个对象头大小占 8 个字节(4字节 Markword + 4字节 类型指针)
  • 在 64 位操作系统上,一个对象头大小占 16 个字节(8字节 MarkWord + 8字节 类型指针)

在 64 为操作系统上,如果开启了指针压缩,则对象头的大小为 12 字节(8字节 MarkWord + 4 字节类型指针)

在这里插入图片描述
现在我们来尝试分析一下 java.lang.String 类型的对象的浅堆为什么是 24 字节吧。
由于开启了指针压缩,

  • 首先 java.lang.String 的对象头为 12 字节,
  • 包含一个 名为 hash 类型为 int 的属性,占 4 字节;
  • 包含一个 名为 value 类型为 引用类型(ref) 的属性,占 4 字节;
  • 在64 位操作系统中,为了和 8 字节对齐,会增加 4 字节的对齐填充

总共占用为(12 + 4 + 4 + 4) = 24 字节。
在这里插入图片描述

深堆(Retianed Heap)

而深堆的计算就稍微有些复杂了,我们不仅需要计算该对象的大小,而且还需要计算该对象所包含的引用对象的大小才能够真正计算出该对象深堆的大小。

首先需要列出一个对象以及对象中所包含的引用:
在这里插入图片描述

使用 List objects 可以列出该类型的全部对象,其中with outgoing references 表示列出该对象所包含的对象,with incoming reference表示列出其他包含该对象的对象。
有点绕口,这里举个例子:
在这里插入图片描述

对于 String(“zhangsan”) 来说,
User 对象包含了该 String,处于 “zhangsan” 的上游,那么该 User 对象是 “zhangsan” 的 incoming。
而 “zhangsan” 所包含的 char[8] 处于 “zhangsan” 的下游 ,则是 “zhangsan” 的 outgoing。

如果要计算深堆的话,我们需要将 String 对象的下游列出来,因此要选择 with outgoing reference

在这里插入图片描述
我们这里计算需要将该对象的浅堆加上该对象所包含引用对象的深堆相加。
比如这里 88 字节 = 24(Shallow Heap) + 64(char[24])

支配树视图(dominator tree)

在这里插入图片描述
支配树视图可以体现对象实例间的支配关系。

注意:对象支配树中,某一个对象的子树,表示在该对象被回收后,也将被回收的对象的集合。

打印出的堆内存快照过大怎么办

可以使用 MAT 的命令行模式首先进行对内存的预分析.
在这里插入图片描述
打开命令行,执行如下命令:

ParseHeapDump.bat <path/to/heap_dump> org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
# 示例
ParseHeapDump.bat D:\Downloads\heap_dump\java.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
  • 1
  • 2
  • 3
参数说明
org.eclipse.mat.api:suspects生成内存泄漏检查报告
org.eclipse.mat.api:overview生成内存分析报告
org.eclipse.mat.api:top_components生成大对象内存占用报告

在命令执行完成后,对应目录下,就会出现相对应的报告的压缩包:
在这里插入图片描述
我们可以直接解压后,通过浏览器浏览该报告,也可以使用 MAT 读取报告。
在这里插入图片描述
在这里插入图片描述

参考资料

Eclipse MAT内存分析
Eclipse MAT内存分析工具
jvm内存快照dump文件太大,怎么分析
JVM heap dump分析

文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览83391 人正在系统学习中

与[转帖]Eclipse MAT 内存分析工具相似的内容:

[转帖]Eclipse MAT 内存分析工具

Exlipse MAT 是一款强大的 Java 堆内存分析工具,我们可以通过该工具实现对 Java 堆内存的分析。 官网。实现查找内存泄漏以及查看内存消耗的情况。 MAT 使用 首先去官网下载对应的软件压缩包,下载地址。MAT 提供了多种平台的软件包支持,包括 Windows , Mac OSX ,

[转帖]发布即巅峰!万字长文:Java性能调优六大工具:MAT内存分析工具

jianshu.com/p/4ed3dd8b7b83 MAT是MemoryAnalyzerTool的简称,它是一款功能强大的Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况。MAT是 基于Eclipse开发的一款免费的性能分析工具,读者可以在http://www.eclipse.org

[转帖]Eclipse-MAT的插件介绍使用

学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记 概述 MAT (Memory Analyzer Tool ) 工具是一款功能强大的Java堆内存分析器.可以用于查找内存泄露以及查看内存消耗情况. MAT是基于Eclipse开发的,不仅仅可以单独使用,还可以作为插件的形式内嵌在Eclipse中使

[转帖]Shallow vs. Retained Heap

https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fbatch.html&resultof%3D%2522%2562%2561%2574%2563%2568%2522%2520%25

[转帖]Batch mode

https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fbatch.html&cp%3D54_3_14 Memory Analyzer can be operated in batch

[转帖]Analyzing Threads

https://help.eclipse.org/latest/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fcomparingdata.html&cp%3D54_3_11 Memory Analyzer provides several

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww