MAT分析内存泄露分析

简介

下面通过一个简单的例子来介绍一下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参数和实时的堆的一些变化。

转载于:https://my.oschina.net/u/2474629/blog/912050

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值