Overview

MAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗。分析Process showmap中的/dev/ashmem/dalvik-heap(deleted)一项所占用的Memory.可以参考我写的使用showmap分析系统内存占用情况一文。

下面就将一下如何使用Eclipse MAT分析Android应用程序内存的消耗。所需要的是已经安装ADT和SDK的Eclipse.然后可以在http://www.eclipse.org/mat/ 下载MAT插件将MAT安装在Eclipse上。

如下图所示,手机连接电脑,打开Eclipse,进入DDMS中,选择一个进程,可以看到下面的

画面:

update

Heap键的作用是立即更新,使工具可以获得手机上运行的Android应用程序的最新Heap分配状况。dump Hprof键则可以立即dump

Hprof文件(Java Heap 分配信息存储在Hprof文件中)。 Cause GC键主要就是强制引发一次GC(垃圾回收)。

点击dump Heap键,我们会看到如下画面:

这个就是Eclipse中Hprof文件分析界面的主页面了。

其中Histogram可以看到所有实例的分配情况, Dominator Tree列出了堆的最大对象。 Leak Suspects主要是列出怀疑的内存泄露处。

Histogram

首先,我们来看一下Histogram,

这个列出了所有实例类型,右键选中实例类型Byte,选择Merge

Shortest Paths to GC Root,然后选择excluse all phantom/weak/soft etc

refereneces. Merge Shortest Paths to GC Root主要显示最短离GC

Root的路径。Java的垃圾回收机制简单来说有点类似树的深度遍历方式,如果一个对象有引用,则GC

Root到这个对象之间是有路径可达的。如果GC Root到 这个对象之间无任何路径可达,则这个对象是不可触及的,是可以回收的。exclude

all phantom/weaker/soft etc

references则是排除虚引用,弱引用及软引用。因为这些引用一般是可以回收的。 (详细解释请参考深入Java虚拟机 垃圾回收一章)。

然后可以可以看到如下画面:

其中可以看到Resources类中有个sPreloadedDrawables的LongSparseArray对象,sPreloadedDrawables中有个mValues的Object数组,数组第139个个元素是一个NiePatchDrawable的对象,这个对象有个mNinePatch的对象,mNinePatch则有一个mChunk的Byte数组的引用。

可能大家已经注意到图中有个Shallow heap和Retained Heap, 具体代表什么意思呢?简单来讲,Shallow Heap Size是对象自身占用的Size。 Retained Heap Size是对象自身的Shallow Size +对象直接引用或者间接引用的对象的Shallow Size。

然后结合代码可以分析出来这个Byte数组是如何引用的,以及这个Byte数组是什么时候创建和销毁的,其创建和销毁是否是合理的。

假如说上面对象此时本来应该是被GC掉的,那么我们应该如何处理了。简单的办法就是将其中的某处置为null或者remove掉,使其到GC Root无路径可达,处于不可触及状态,垃圾回收器就可以回收了。

由于有很多对象,为了分析方便,我们可以点击Cause GC键使其强制发生一次GC,这样可以减少对象的个数,便于我们分析。

Leak Suspects

Leak Suspects列出了工具怀疑的内存泄露点。

在下图中,MAT工具怀疑第一个问题有1.5M的内存泄露:

然后接着,是问题一的描述,列出了一些比较大的实例。

点击Details可以看到细节信息。

不过工具怀疑的也未必真的是存在的,但提供了一种参考。

mat java_使用MAT分析Java内存相关推荐

  1. mat工具MemoryAnalyzer进行分析java内存溢出hprof文件

    java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...

  2. 从一个OutOfMemoryError 学会了分析Java内存泄漏问题

    从一个OutOfMemoryError 学会了分析Java内存泄漏问题 以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap ...

  3. 利用java虚拟机的工具jmap分析java内存情况

    2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug ...

  4. java jmap 分析_利用java虚拟机的工具jmap分析java内存情况

    有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...

  5. java hprof文件_mat工具MemoryAnalyzer进行分析java内存溢出hprof文件

    java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...

  6. 透彻分析JAVA内存泄漏和内存溢出的区别

    JAVA内存泄漏和内存溢出的区别和联系 1.内存泄漏memory leak : 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出. 2 ...

  7. 一文深度分析Java内存模型

    0x01 内存模型产生的历史背景 曾经,计算机的世界远没有现在复杂,那时候的cpu只有单核,我们写的程序也只会在单核上按代码顺序依次执行,根本不用考虑太多. 后来,随着技术的发展,cpu的执行速度和内 ...

  8. idea分析java内存溢出_IDEA内存溢出解决办法

    1.不要通过idea.exe启动,而是通过idea64.exe启动IDEA 2.修改参数文件为idea.exe.vmoptions 原文件为: -server -Xms128m -Xmx1024m - ...

  9. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  10. JAVA内存分析:基于dump内存溢出快照分析

    JAVA内存分析 JAVA内存分析一:基于dump内存溢出快照分析 JAVA内存分析二:idea集成jprofiler查看JVM内存使用情况 JAVA内存分析三:使用JDK自带工具进行内存和CPU分析 ...

最新文章

  1. Mybatis---总结
  2. react实现svg实线、虚线、方形进度条
  3. 去除List集合中的重复值(四种好用的方法)
  4. python去重语句_Python对列表去重的多种方法(四种方法)
  5. 通信原理实践(一)——音频信号处理
  6. 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
  7. 安卓实现调用三方地图导航
  8. 纯CSS3绘制的小猫笑脸动画
  9. 数据分析案例-电影数据可视化分析
  10. 如何和下属谈心(转)
  11. 小红书如何营销?各大品牌小红书运营投放营销策划方案合集(13份)
  12. 怎么进入云计算这个行业?新手怎么学习云计算?
  13. 微信公众号怎么添加附件?
  14. 关于layer.open()弹出页面与”父页面“之间获取数据赋值给页面Element的问题
  15. RabbitMQ特殊应用
  16. 流年的最新伤感日志:年轻的时候,会轻狂
  17. 编程题走迷宫_迷宫--小学生编程竞赛题目(两种解法,一种简单的推荐)
  18. 字符串中首次出现三次的字符
  19. 【Simulink Test】模型自动测试
  20. 基于PWM控制的声音播放的实现

热门文章

  1. 学习笔记 Tianmao 篇 recyclerView 辅助的RecycleAdapterImpl类(适配自定义home三型)
  2. 鹏业安装算量软件功能按钮汇总(一)
  3. Java四大元注解介绍
  4. [论文学习] 一种线性时不变时滞系统的稳定性分析方法(CTCR)
  5. JAVA能写大型游戏么?
  6. Hive行转列的应用之计算公司累加收入
  7. 定制性MES系统软件
  8. 大屏可视化之适配和布局
  9. html5字体的格式转换,font字体
  10. 《跟任何人都聊得来》读书笔记