精华内容
下载资源
问答
  • 使用Mat查看Dump文件

    千次阅读 2019-05-07 14:17:30
    下载完后,在MAC环境下,可能查看报错,使用下面的方法 Mac Mat独立版本打开失败解决方案 1.右键进入软件包内容 2.进入目录下(如图所示) 3.打开命令终端 输入 ./MemoryAnalyzer -data ./workspace 就可以...

    Mat下载地址:

    https://www.eclipse.org/mat/downloads.php

    下载完后,在MAC环境下,可能查看报错,使用下面的方法

    Mac Mat独立版本打开失败解决方案

    1.右键进入软件包内容

    è¿éåå¾çæè¿°

    2.进入目录下(如图所示)

    è¿éåå¾çæè¿° 

    3.打开命令终端 输入

    ./MemoryAnalyzer -data ./workspace

    就可以打开mat软件了

    转载于:https://blog.csdn.net/EaskShark/article/details/82664473 

    展开全文
  • MAT分析DUMP文件

    千次阅读 2020-05-18 17:56:42
    第一步:使用MAT打开dump文件 第二部:点击Dominator Tree 可以看到内存占用比较高的线程有2个 第三部:选中需要查看的线程,查看stack 第四部:此时显示的就是发生堆栈溢出时的栈信息,并且有占用大小,...

    如何在jvm启动脚本中添加内存溢出自动dump的内容就不赘述了。

    今天就只关注dump下来的文件如何进行分析,如何找到是哪一块代码出现了问题。

    使用的工具是MAT

    第一步:使用MAT打开dump文件

    第二部:点击Dominator Tree

    可以看到内存占用比较高的线程有2个

    第三部:选中需要查看的线程,查看stack

    第四部:此时显示的就是发生堆栈溢出时的栈信息,并且有占用大小,就能找到对应的代码位置,未截图的部分就是项目中的代码位置了

    另外还可以查看集合中的元素值,也是在dominator_tree中,选中需要查看的集合

    下图中模糊位置就是key和value的值

     

    如果想快速的查看stack,还有另外一个方式,Leak Suspects,生成分析报告

    然后会出现如下画面,点击See stacktrace就可以查看了

     

    总结:

    MAT功能很多,根据不同的场景,使用不同的功能。

    展开全文
  • 创建dump文件 方式一:使用 jmap 命令创建,例如 jmap -dump:format=b,file=heapdump.hprof 27012(进程ID) 方式二:运行java程序的时候开启HeapDumpOnOutOfMemoryError...MAT工具下载地址:https://www.eclipse.org

    概述

    在生产环境中,有时会遇到项目报 OOM 的错误,如果能知道是什么对象导致的,就能提高我们解决该问题的几率。这里,MAT就是分析 JVM 堆内存的常用工具之一。

    创建dump文件

    • 方式一:使用 jmap 命令创建,例如 jmap -dump:format=b,file=heapdump.hprof 27012(进程ID)
    • 方式二:运行java程序的时候开启HeapDumpOnOutOfMemoryError参数(发生OOM的时候自动创建dump),例如 java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError HelloWorld

    分析dump文件

    MAT工具下载地址:https://www.eclipse.org/mat/downloads.php

    1.运行 MemoryAnalyzer.exe,点击 Open a Heap Dump,选择上一步生成的 dump 文件
    在这里插入图片描述

    2.分析堆内存

    如图所示&#

    展开全文
  • 今天介绍的工具MAT,既可以使用dump日志分析内存问题,也可以在程序运行期间,获取程序当时运行的快照进行分析。 内存分析工具 JDK自带工具VisualVM 案例 分析代码 本程序可以大概看一下,首先先启动一个...

    前言

    我们使用jmap-histo这种命令去分析哪些对象占据着我们的堆空间。但是那是比较容易分析的问题。如果遇到的是内存情况比较复杂的情况,基础命令是不容易分析问题的。这时,我们需要借助工具。今天介绍的工具MAT,既可以使用dump日志分析内存问题,也可以在程序运行期间,获取程序当时运行的快照进行分析。

    内存分析工具

    JDK自带工具VisualVM

    案例

    分析代码

    本程序可以大概看一下,首先先启动一个线程池。这个线程池的其实容量与最大容量设置死,也就是说最多可同时容纳开启50个线程执行任务。并且队列使用的无界队列。

    仔细分析代码可以知道,我们每0.1s给线程池丢100个任务,而线程池没3s才搞定一个任务。因此这些未执行的任务的对象无法回而导致OOM。

    -XX:+HeapDumpOnOutOfMemoryError//此参数添加后,可以在程序OOM后自动生成dump日志。

    使用VisualVM

    VisualVM目录在我们的jdk/bin下。

    VisualVm 属于比较寒酸的工具,基本上跟 jmap 之类的命令没多少区别,它只是可以事后看,通过 dump 信息来看,里面没有多少可以做分析的功能。

    MAT简介

    MAT 工具是基于 Eclipse 平台开发的,本身是一个 Java 程序,是一款很好的内存分析工具,所以如果你的堆快照比较大的话,则需要一台内存比较大的分析机器,并给 MAT 本身加大初始内存,这个可以修改安装目录中的 MemoryAnalyzer.ini 文件

     

    概要

    柱状图

    MAT中的Incoming/Outgoing References

    在柱状图中,我们看到,其实它显示的东西跟 jmap –histo 非常相似的,也就是类、实例数量、空间大小。

    但是 MAT 有一个专业的概念,这个可以显示对象的引入和对象的引出。

    在 Eclipse MAT 中,当右键单击任何对象时,将看到下拉菜单。如果选择“ListObjects”菜单项,则会注意到两个选项:

    1. Ø with incoming references 对象的引入
    2. Ø with outgoing references 对象的引出

    案例

    我们说两个类直接的关系除了继承之外,还可以是组合。

    我们根据上述代码可以画出各类的组合关系图:

    代码中对象和引用关系如下:

    对象 A 和对象 B 持有对象 C 的引用

    对象 C 持有对象 D 和对象 E 的引用

    运行程序

    MAT 连接上(MAT 不单单只打开 dump 日志,也可以打开正在运行的 JVM 进程,跟 arthas 有点类似,效果是一样的,只是一个是动态的,一个是日志导出那个时刻的)

    可以从上面的图中分析,看到incoming references代表该类对象被哪些类所持有。相反的,outgoing reference代表本类所持有哪些类的对象。

    这个 outgoing references 和 incoming references 非常有用,因为我们做 MAT 分析一般时对代码不了解,排查内存泄漏也好,排查问题也好,垃圾回收中有一个很重要的概念,可达性分析算法,那么根据这个引入和引出,我就可以知道这些对象的引用关系,在 MAT 中我们就可以知道比如 A,B,C,D,E,F 之间的引用关系图,便于做具体问题的分析。

    MAT中的浅堆和深堆

    浅堆(shallow heap

    代表了对象本身的内存占用,包括对象自身的内存占用,以及“为了引用”其他对象所占用的内存。

    深堆(Retained heap

    是一个统计结果,会循环计算引用的具体对象所占用的内存。但是深堆和“对象大小”有一点不同,深堆指的是一个对象被垃圾回收后,能够释放的内存大小,这些被释放的对象集合,叫做保留集(Retained Set)

    Java对象内存大小

    JAVA 对象大小=对象头+实例数据+对齐填充

    非数组类型

    浅堆(shallow_size)=对象头+各成员变量大小之和+对齐填充

    其中,各成员变量大小之和就是实例数据,如果存在继承的情况,需要包括父类成员变量

    数组类型

    深堆(Retained _size)=对象头+类型变量大小*数组长度+对齐填充,如果是引用类型,则是四字节或者八字节(64 位系统),如果是 boolean 类型,则是一个字节 。

    注意:这里类型变量大小*数组长度 就是实例数据,强调是变量不是对象本身

     

    案例分析

    对象 A 持有对象 B 和 C 的引用。

    对象 B 持有对象 D 和 E 的引用。

    对象 C 持有对象 F 和 G 的引用。

    一句话,浅堆就是自身对象大小,那么深堆就是根可达分析自己后面的引用链对象总大小+自己的大小呢?我们接着看。往往深堆更能体现出一个对象的回收价值。

    引用变动的影响

    在下面的示例中,让对象 H 开始持有对 B 的引用。注意对象 B 已经被对象 A 引用了。

    在这种情况下,对象 A Retained heap 大小将从之前的 70 减小到 40 个字节

    如果对象 A 被垃圾回收了,则将仅会影响 C、F 和 G 对象的引用。因此,仅对象 C、F 和 G 将被垃圾回收。另一方面,由于 H 持有对 B 的活动引用,因此对象 B、D 和 E 将继续存在于内存中。因此,即使 A 被垃圾回收,B、D 和 E 也不会从内存中删除。因此,A 的 Retained heap 大小为:= A的 shallow heap 大小 + C 的 shallow heap 大小 + F 的 shallow heap 大小 + G 的 shallow heap 大小 = 10 bytes + 10 bytes + 10 bytes + 10 bytes = 40

    bytes.

    总结:因此我们说深堆大小并不能直接从引用链的角度来分析,而是要站在垃圾回收的根可达分析算法的角度,看这个对象会收的后真正可以释放的内存大小。我们分析问题时,往往去那些深堆很大,尤其那些浅堆比较小,但深堆比较大的对象。它们极有可能是有问题的对象。

    使用 MAT 进行内存泄漏检测

    案例

    仔细分析代码,我们可以发现A引出B引出C。king-thread线程中,包含一个map,map又引出了A(包含了A的实例a)。同时Demo1与Demo2互相引用。总结为下图关系:

    运行程序并使用MAT调试

    当我们产生问题时,MAT会帮助我们进行问题猜测。这个程序的泄漏很明显,就是线程无法结束,导致map无法销毁,导致深堆过大的内存泄漏。

    这里一个名称叫做 king-thread 的线程,持有了超过 99% 的对象,数据被一个 HashMap 所持有。

    这个就是内存泄漏的点,因为我代码中对线程进行了标识,所以像阿里等公司的编码规范中为什么一定要给线程取名字,这个是有依据的,如果不取名字的话,这种问题的排查将非常困难。

    所以,如果是对于特别明显的内存泄漏,在这里能够帮助我们迅速定位,但通常内存泄漏问题会比较隐蔽,我们需要做更加复杂的分析。

    支配树视图

    支配树列出了堆中最大的对象,第二层级的节点表示当被第一层级的节点所引用到的对象,当第一层级对象被回收时,这些对象也将被回收。这个工具可以帮助我们定位对象间的引用情况,以及垃圾回收时的引用依赖关系。支配树视图对数据进行了归类,体现了对象之间的依赖关系。我们通常会根据“深堆”进行倒序排序,可以很容易的看到占用内存比较高的几个对象,点击前面的箭头,即可一层层展开支配关系(依次找深堆明显比浅堆大的对象)。

    从上图层层分解,我们也知道,原来是 king-thread 的深堆和浅堆比例很多(深堆比浅堆多很多、一般经验都是找那些浅堆比较小,同时深堆比较大的对

    象)

    1、 一个浅堆非常小的 king-thread 持有了一个非常大的深堆

    2、 这个关系来源于一个 HashMap

    3、 这个 map 中有对象 A,同时 A 中引用了 B,B 中引用了 C

    4、 最后找到 C 中里面有一个 ArrayList 引用了一个大数据的数组。经过分析,内存的泄漏点就在此。线程中的map长期持有100个超大的ArrayList ,有可能导致内存泄漏。

    MAT 中内存对比

    我们对于堆的快照,其实是一个“瞬时态”,有时候仅仅分析这个瞬时状态,并不一定能确定问题,这就需要对两个或者多个快照进行对比,来确定一个增长趋势。我们导出两份 dump 日志,分别是上个例子中循环次数分别是 10 和 100 的两份日志。

    线程视图

    想要看具体的引用关系,可以通过线程视图。线程在运行中是可以作为 GC Roots 的。我们可以通过线程视图展示了线程内对象的引用关系,以及方法调用关系,相对比 jstack 获取的栈 dump,我们能够更加清晰地看到内存中具体的数据。我们找到了 king-thread,依次展开找到 holder 对象,可以看到内存的泄漏点

    我们通过展开的层层定位也找到了主要占据内存的是这个list。

    还有另外一段是陷入无限循环,这个是相互引用导致的(进行问题排查不用被这种情况给误导了,这样的情况一般不会有问题---可达性分析算法的解决了相互引用的问题)。具体可以结合上面给出的代码分析图。

    柱状图视图

    柱状图视图,可以看到除了对象的大小,还有类的实例个数。结合 MAT 提供的不同显示方式,往往能够直接定位问题。可以看到,创建的这些自定义对象,不多不少正好一百个。

    可以看到该类的引入的具体对象

    Path To GC Roots

    被 JVM 持有的对象,如当前运行的线程对象,被 systemclass loader 加载的对象被称为 GC Roots,从一个对象到 GC Roots 的引用链被称为 Path to GC Roots,

    通过分析 Path to GC Roots 可以找出 JAVA 的内存泄露问题,当程序不在访问该对象时仍存在到该对象的引用路径(这个对象可能内存泄漏)。

    再次选择某个引用关系,然后选择菜单“Path To GC Roots”,即可显示到 GC Roots 的全路径。通常在排查内存泄漏的时候,会选择排除虚弱软等引用。

    我们通过刚才柱状图视图获得了对象的列表。

    我们就可以得到清晰地该对象的引入链,一直到其对应的GCRoots。

    高级功能—OQL

    MAT 支持一种类似于 SQL 的查询语言 OQL(Object Query Language),这个查询语言 VisualVM 工具也支持。

    查询 A 对象:

    select * from ex14.ObjectsMAT$A

    查询包含 java 字样的所有字符串:

    select * from java.lang.String s where toString(s) like ".*java.*"

    OQL 有比较多的语法和用法,若想深入了解,可以了解这个网址 http://tech.novosoft-us.com/products/oql_book.htm

    展开全文
  • MAT下载地址:https://www.eclipse.org/mat/ 1.File->Open File->找到dump文件打开即可 2.Java Basics->GC Roots 3.找到你要查看的线程打开即可
  • 使用MAT分析dump文件

    2020-12-30 11:23:53
    文章目录下载配置MAT基本参数jmap dump整个堆linux MAT分析 dump查看报告结果 下载 linux 下载 windows 下载 配置MAT基本参数 修改MAT的内存大小, 注意这个大小要根据你dump文件大小来的,如果dump文件是5GB那么 ...
  • 下载下来一点dump文件很大,然后使用mat分析的时候mat本身报错 Out of Memory Error while Running the Memory Analyzer 这是因为eclipse配置的内存太小了导致的,网上查了下都是去改MemoryAnalyzer.ini的...
  • mat java 分析 文件 dump

    2012-08-10 11:54:44
    mat 工具 使用 方法 讲解 java dump 文件 分析
  • MAT分析dump文件显示大小比jmap查询结果小

    万次阅读 多人点赞 2021-03-03 12:04:23
    背景 有朋友向我吐槽,她在一台测试机器上调试,使用jmap查看堆内存占用时,发现年轻代+老年代占用的内存,和dump下堆转储文件使用MAT分析显示的内存不一样,百思不得其解。重现现象如下: jmap显示堆使用情况 上图...
  • Widows 分析dump文件的工具太多了,而且都是傻瓜式的点点就好了。但是生产上分析dump文件的话,还是linux工具比较方便,因为生产上的dump文件一般都至少是GB级别的,这么大的文件拷贝到本机要耗费很长时间,特别是...
  • 2.分析工具对比(jvisualvm,jhat,mat) 3.MAT的功能介绍 3.1 大功能模块 3.2小功能(右键或单机) 4.使用方法(只介绍自动分析) 4.1 内存整体使用报告(点击System Overview) 4.1.1 Histogram 直方图统计 ...
  • 第23课:使用MATDump文件进行分析实战 /* 王家林老师授课http://weibo.com/ilovepains 每天晚上20:00YY频道现场授课频道68917580*/   1 导出Dump文件 2 使用MATDump文件进行分析实战   一:下载安装mat ...
  • eclipse mat 分析dump文件,打开文件报错,out of memeory 解决: 1.打开eclipse报out of memeory通用 window-->Preferences-->java-->installed JREs-->选中-->edit--> 在...
  • 一点睛 ...MAT 可以分析 heap dump 文件。在进行内存分析时,只要获得了反映当前设备内存映像的 hprof 文件,通过 MAT 打开就可以直观地看到当前的内存信息。一般说来,这些内存信息包含: 所有.
  • JAVA Dump 是当tomcat出现假死状态时,保留当前内存情况下记录二进制文件。使用MAT工具进行分析内存泄漏问题。 第一步: 需要在tomcat的catalina.sh中添加 如下配置 JAVA_OPTS="-Xms8192m -Xmx8192m -XX:PermSize=...
  • Dump文件分析工具 - MAT图文解析

    千次阅读 2020-05-27 16:00:00
    在讲解Mat工具之前我们先来看下几个关于Dump/文件的问题 Dump文件是什么 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中 我们拿到Dump文件有什么用的? 假如JVM因为内存溢出的...
  • 22.使用MATDump文件进行分析实战

    千次阅读 2016-06-01 16:47:06
    下载mat http://www.eclipse.org/mat/downloads.php 设置eclipse运行参数 -server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC  -XX:+PrintGCApplicationStoppedTime  -XX:+...
  • MAT分析dump文件

    千次阅读 2017-03-20 22:18:14
    1111
  • eclipse mat 打开dump文件,明明大小1G,打开后却只有不到100M.其他的去哪了 Used heap dump 显示的大小远小于dump文件大小 解决: window-->Preferences-->memory Analuzer-->勾选keep ...
  • Mat 插件地址:http://www.eclipse.org/mat/downloads.php http://www.eclipse.org/downloads/download.php?file=/mat/1.8.1/rcp/MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip&...dump文件命...
  • 解决方法: 将mat目录下的MemoryAnalyzer.ini里面的-Xmx参数调整为20480m等大参数,然他她有充足的空间去进行分析dump
  • Java 启动命令加上: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxx.dump ...ParseHeapDump.sh xxx.dump org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_compon
  • 当成功启动 MAT 后,通过菜单选项 “File -> Open Heap Dump…” 打开指定的 dump 文件后,将会生成 Overview 选项,如下所示: 顶部功能区说明: 功能说明 Overview 显示概要信息,并...
  • 通过查询相关文档,发现可以使用Mat命令行脚本生成可供Mat图形化界面展示的文件,也就是 用Linux服务器进行分析大堆/超大堆 dump文件,输出分析报告,通过浏览器直接查看! 运行环境 CentOS 7.4 Mem
  • 当用mat分析过大的dump文件时,可能由于文件太大而mat的内存不足导致报错,Java heap space。 解决方法为: 1. 运行的时候指定vm参数,加大分配内存(如运行在64位机上) MemoryAnalyzer.exe -vmargs -Xmx4g -XX:...
  • 1. 获取出现OutOfMemoryError时对应的heap dump通过在启动命令中追加如下jvm参数-XX:+HeapDumpOnOutOfMemoryErro...
  • 官网下载连接:https://www.eclipse.org/mat/downloads.php 下载 wget http://eclipse.stu.edu.tw/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip 解压 unzip MemoryAnalyzer-1.8.0.20180604-...
  • MAT比较多个heap dump文件 调试内存泄露时,有时候适时比較2个或多个heap dump文件是非常实用的。这时须要生成多个单独的HPROF文件。 以下是一些关于怎样在MAT里比較多个heap dumps的内容 1.第一个HPROF 文件...
  • 1.获取出现OutOfMemoryError时对应的heap dump 通过在启动命令中追加如下jvm参数 -XX:+HeapDumpOnOutOfMemoryError 此时当应用程序出现OutOfMemoryError会在当前的工作目录下生成dump文件。可以追加如下jvm参数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,249
精华内容 6,099
关键字:

mat查看dump