文档章节

MAT分析内存泄露分析

trayvon
 trayvon
发布于 2017/05/31 21:28
字数 647
阅读 100
收藏 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
粉丝 14
博文 125
码字总数 185343
作品 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
关于android应用内存占用查看及优化

第一步: 查看内存使用情况 我常用的查看内存使用情况的两种方式: 1、使用命令:adb shell dumpsys meminfo $package_name or $pid 2、 通过ddms查看 如果通过监控发现内存居高不下,一直增...

roc2013
2012/11/05
0
2
一次OOM的排查过程

最近测试环境的Java应用经常挂掉,用jconsole查看堆内存使用情况,如下图: 在达到高峰的时候tomcat服务挂了,看图可以知道使用内存过大,于是开始追踪元凶。 加入启动参数 在catalina.sh加入...

耀子
2016/07/12
48
0

没有更多内容

加载失败,请刷新页面

加载更多

开源软件会被云杀死吗 ?

本文转载云头条,原作者:Michael Stiefel是Reliable Software公司的负责人,是一名软件架构和开发顾问。 文章要点 虽然开源开发不会消失,但商业开源厂商的未来不是很有希望。随着全面管理的...

linuxCool
23分钟前
0
0
OSChina 周三乱弹 —— 谈什么对象?睡什么觉?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @胖达panda :最肯忘却古人诗,最不屑一顾是相思。分享童丽的单曲《红豆生南国》: 《红豆生南国》- 童丽 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
28分钟前
43
3
stylus

stylus基础教程,stylus实例教程,stylus语法总结

miaojiangmin
今天
3
0
PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部