文档章节

MAT分析内存泄露分析

trayvon
 trayvon
发布于 2017/05/31 21:28
字数 647
阅读 46
收藏 1

简介

下面通过一个简单的例子来介绍一下mat的使用:

import java.util.LinkedList;
/**
 * -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump
 *
 */
public class HeapDump {
    
    public static void main(String[] args) {
        LinkedList<HeapDump> list = new LinkedList<HeapDump>();
        while(true){
            list.add(new HeapDump());
        }
    }

}
java.lang.OutOfMemoryError: GC overhead limit exceeded
Dumping heap to E:\Java\dump\java_pid2536.hprof ...
Heap dump file created [37651239 bytes in 0.219 secs]
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at cn.freemethod.inspect.HeapDump.main(HeapDump.java:14)

除了通过-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\Java\dump虚拟机参数还可以通过jmap命令来获取堆信息。 jmap -dump:live,format=b,file=E:/java/dump/heap.bin pid jmap -dump:file=E:/java/dump/heap.hprof pid

jmap命令非常有用,在线上环境是不允许使用jvisualvm这样对性能影响较大的工具的时候,并且有时候会有一些情况下不允许立即内存溢出,就可以通过jmap命令来获取堆,jmap命令也会比其他三方工具占用更少的资源。

MAT

mat概览

如上图中蓝1所示,在概览中主要是展示了对的大小,Class的多少,对象的多少,类加载器的多少。 如上图中蓝2中涉及2个概念Shallow Size和Retained Size: Shallow Size是指对象自身占用的内存大小,不包括它引用的对象。针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。针对数组类型的对象,它的大小是数组元素对象的大小总和。 Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和 上图中蓝3是对象多少的柱状图和主要对象的链接,蓝4是可能存在泄漏的分析链接。

mat histogram

上图柱状图所表示的是对象的多少和占用的大小的排序。

mat list objects

上图是柱状图的的对象列表涉及到下面2个概念:

with outgoing reference:持有的外部对象引用

with incoming reference:被外部对象引用

with incoming

with outgoing

show object by class

如上图是是对类的查看,主要涉及下面2个概念:

by outgoing reference:持有的外部类引用

by incoming reference:被外部类引用

by incoming

by outgoing

leak suspect

上图是内存泄露可能存在的点分析定位

system overview

上图是mat中的系统信息概览,主要帮助问题定位和重现

thread overview

上图是线程的概览,帮助定位分析问题出现在哪一个线程之中。

jmap heap

上图是jmap的heap参数命令,可以查看到一下堆相关的vm参数和实时的堆的一些变化。

© 著作权归作者所有

共有 人打赏支持
trayvon
粉丝 15
博文 124
码字总数 184644
作品 1
程序员
使用 Eclipse Memory Analyzer 进行堆转储文件分析

简介: Eclipse Memory Analyzer(MAT)是著名的跨平台集成开发环境 Eclipse Galileo 版本的 33 个组成项目中之一,它是一个功能丰富的 JAVA 堆转储文件分析工具,可以帮助你发现内存漏洞和减...

红薯
2010/07/26
1K
0
Android 内存泄露优化处理

参考: Android应用内存泄露分析、改善经验总结 使用新版Android Studio检测内存泄露和性能 解决安卓CPU使用率过高问题 Android CPU使用过大的问题解决以及造成的原因 AndroidStudio CPU Mo...

天鬼
2017/11/06
0
0
Android中如何查找内存泄露

1、首先确定是否有内存泄露及哪个程序造成。 1.1、内存泄露已弹出out of memory对话框的情况。 这种情况很简单,直接看对话框就知道是哪个应用的问题了。然后再分析该应用是否是因为内存泄露...

chengche
2013/11/27
0
0
内存泄露从入门到精通三部曲之排查方法篇

腾讯Bugly特约作者: 姚潮生 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落。 这种方式可以发现最...

腾讯Bugly
2015/11/26
1K
4
内存泄露从入门到精通三部曲之排查方法篇

腾讯Bugly特约作者: 姚潮生 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落。 这种方式可以发现最...

腾讯Bugly
2015/11/26
82
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
7分钟前
0
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
30分钟前
0
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
59分钟前
0
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
99
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部