文档章节

MAT分析内存泄露分析

trayvon
 trayvon
发布于 2017/05/31 21:28
字数 647
阅读 28
收藏 1
点赞 0
评论 0

简介

下面通过一个简单的例子来介绍一下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
博文 119
码字总数 176520
作品 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
一次OOM的排查过程

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

耀子
2016/07/12
48
0
关于android应用内存占用查看及优化

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

roc2013
2012/11/05
0
2
浅尝Eclipse Memory Analyzer(MAT)

前言 在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题。我们需要找造成OutOfMemoryError原因。一般有两种情况: 1、内存泄露...

fdhay
2016/03/09
51
0
如何分析android的OOM,与java静态代码分析工具

用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause。根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例如 Android ...

踏雪秋菊
2016/09/19
48
0
Android 内存分析工具

Dalvik 虚拟机支持垃圾收集,但是这不意味着你可以不用关心内存管理。你应该格外注意移动设备的内存使用,手机和平板的内存空间是受到限制的。 在这篇文章里面,我们来看看Android SDK里面的...

长平狐
2013/01/06
4.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部