MAT——使用示例教程

前言

Memory Analyzer :一款很强大的内存分析工具。

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

 

使用教程

1.首先弄个内存泄漏的场景

   /**
     * ThreadLocal误用,模拟并发内存泄漏场景
     * 可把JVM option -xmx设置小一些,例如800m,方便触发mmo
     */
    @RequestMapping(value = "/test0")
    public String test0(HttpServletRequest request) {
        ThreadLocal<Byte[]> localVariable = new ThreadLocal<Byte[]>();
        localVariable.set(new Byte[4096*1024]);// 为线程添加变量
        return "success";
    }

通过ab工具,或者jmeter模拟多线程并发访问该接口,稍等一会。配合步骤1,就能拿到oom dump

 

2. 生成dump hprof内存快照文件,主要有两种方法

  1)运行程序前添加JVM OPTION
-Xms400m
-Xmx800m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./tmp/heapdump.hprof
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:./tmp/heapTest.log


其中这两句才是关键产生dump设置
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./tmp/heapdump.hprof

 

  2) 通过jmap命令,使运行程序生成dump快照
命令:jmap -dump:format=b,file=heapdump.hprof [pid]

 

3.通过MAT,打开hprof文件

总览界面如下:

 clipboard.png

图中圈红的部分,是最常用的功能,分别为leak Suspects、Histogram、Dominator Tree

常用先看下leak Suspects,问题挺大概率出现在see stacktrace里面

 

MAT排查问题还是挺精准的

可能会有疑问,总览饼图里对象占用内存似乎不足800m(堆最大分配内存),但其实是因为并发速度快,导致频繁触发Full GC后把不可达对象的byte数组回收掉了,所以饼图看到当前内存占用并不高。可以检查Histogram或者Unreachable Objects Histogram

可以看到byte[]占用了异常巨大的内存。

ps:也可以使用jdk自带工具,jvisualvm打开hprof查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值