mat java_使用MAT分析Java内存
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内存相关推荐
- mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...
- 从一个OutOfMemoryError 学会了分析Java内存泄漏问题
从一个OutOfMemoryError 学会了分析Java内存泄漏问题 以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap ...
- 利用java虚拟机的工具jmap分析java内存情况
2019独角兽企业重金招聘Python工程师标准>>> 有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug ...
- java jmap 分析_利用java虚拟机的工具jmap分析java内存情况
有时候碰到性能问题,比如一个java application出现out of memory,出现内存泄漏的情况,再去修改bug可能会变得异常复杂,利用工具去分析整个java application 内 ...
- java hprof文件_mat工具MemoryAnalyzer进行分析java内存溢出hprof文件
java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...
- 透彻分析JAVA内存泄漏和内存溢出的区别
JAVA内存泄漏和内存溢出的区别和联系 1.内存泄漏memory leak : 是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出. 2 ...
- 一文深度分析Java内存模型
0x01 内存模型产生的历史背景 曾经,计算机的世界远没有现在复杂,那时候的cpu只有单核,我们写的程序也只会在单核上按代码顺序依次执行,根本不用考虑太多. 后来,随着技术的发展,cpu的执行速度和内 ...
- idea分析java内存溢出_IDEA内存溢出解决办法
1.不要通过idea.exe启动,而是通过idea64.exe启动IDEA 2.修改参数文件为idea.exe.vmoptions 原文件为: -server -Xms128m -Xmx1024m - ...
- JAVA内存泄露分析和解决方案及WINDOWS自带查看工具
JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...
- JAVA内存分析:基于dump内存溢出快照分析
JAVA内存分析 JAVA内存分析一:基于dump内存溢出快照分析 JAVA内存分析二:idea集成jprofiler查看JVM内存使用情况 JAVA内存分析三:使用JDK自带工具进行内存和CPU分析 ...
最新文章
- Mybatis---总结
- react实现svg实线、虚线、方形进度条
- 去除List集合中的重复值(四种好用的方法)
- python去重语句_Python对列表去重的多种方法(四种方法)
- 通信原理实践(一)——音频信号处理
- 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
- 安卓实现调用三方地图导航
- 纯CSS3绘制的小猫笑脸动画
- 数据分析案例-电影数据可视化分析
- 如何和下属谈心(转)
- 小红书如何营销?各大品牌小红书运营投放营销策划方案合集(13份)
- 怎么进入云计算这个行业?新手怎么学习云计算?
- 微信公众号怎么添加附件?
- 关于layer.open()弹出页面与”父页面“之间获取数据赋值给页面Element的问题
- RabbitMQ特殊应用
- 流年的最新伤感日志:年轻的时候,会轻狂
- 编程题走迷宫_迷宫--小学生编程竞赛题目(两种解法,一种简单的推荐)
- 字符串中首次出现三次的字符
- 【Simulink Test】模型自动测试
- 基于PWM控制的声音播放的实现