Android内存优化9 内存检测工具3 MAT比Menmery Monitor更强大

在Android性能优化第(一)篇---基本概念中讲了JAVA的四大引用,讲了一下GCRoot,第二篇Memory Monitor检测内存泄露仅仅说了Menmery Monitor的使用,这篇博客谈一下MAT来寻找内存泄露,相对来说,Memory Monitor没有MAT强大,但是在开始介绍MAT之前,上两篇没有说清楚的问题先说一下。

  • GC回收对可回收对象的判定
    什么样的对象是可以被回收的?
    当然是GC发现通过任何referencechain(引用链)无法访问某个对象的时候,该对象即被回收。名词GC Roots正是分析这一过程的起点,例如JVM自己确保了对象的可到达性(那么JVM就是GC Roots),所以GCRoots就是这样在内存中保持对象可到达性的,一旦不可到达,即被回收。通常GC Roots是一个在current thread(当前线程)的call stack(调用栈)上的对象(例如方法参数和局部变量),或者是线程自身或者是system class loader(系统类加载器)加载的类以及native code(本地代码)保留的活动对象。所以GC Roots是分析对象为何还存活于内存中的利器。

GC Root Tracing算法,对于可回收对象的判定


上面这段话,也写出了检测内存泄露的基本思想以”GC Roots”的对象作为起始点向下搜索,搜索形成的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即不可达的),则该对象被判定为可以被回收的对象,反之不能被回收。也写出了内存泄露的原因对象无用了,但仍然可达(未释放),垃圾回收器无法回收。

好啦,下面开始介绍MAT,MAT工具全称为Memory Analyzer Tool,(MAT下载:http://eclipse.org/mat/downloads.php)是一款详细分析Java堆内存的工具,该工具非常强大,为了使用该工具,我们需要hprof文件。但是该文件不能直接被MAT使用,需要进行一步转化,可以使用hprof-conv命令来转化,但是AndroidStudio可以直接转化。


导出标准的hprof文件


然後用MAT打开我们导出的文件,我导出了两个文件,test1.hprof和test2.hprof,其中test1.hprof是内存未泄露时的快照,test2.hprof是内存已经泄露的快照。我们用MAT的Histogram(直方图)和Dominator Tree (支配树)来分析内存情况。Histogram可以列出内存中每个对象的名字、数量以及大小。Dominator Tree会将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构。


MAT工具主界面
一、 Histogram(直方图)

可列出每一个类的实例数。支持正则表达式查找,也可以计算出该类所有对象的retained size。默认是通过class(group by class)分类展示的。


直方图.png

这就是test2.hprof的直方图。现在要说两个名词解释。Shallow Heap/Retained Heap

  • Shallow Heap
    Shallow size就是对象本身占用内存的大小,不包含其引用的对象内存,实际分析中作用不大。在堆上,看起来是一堆原生的byte[], char[], int[],对象本身的内存都很小。所以我们可以看到以Shallow Heap进行排序的Histogram图中,排在第一位第二位的是byte,char
  • Retained Heap
    Retained size是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。RetainedHeap可以更精确的反映一个对象实际占用的大小(因为如果该对象释放,retained heap都可以被释放)。

Histogram中是可以显示对象的数量的,那么比如说我们现在怀疑MainActivity中有可能存在内存泄漏,就可以在第一行的正则表达式框中搜索“MainActivity”,如下所示:



可以看到MainActivity的数量是2,这不正常,解决这个,就需要查看MainActivity被谁引用了,不能被释放。我们右键选择exclude all phantom/weak/soft etc.references, 意思是查看排除虚引用/弱引用/软引用等的引用链 (这些引用最终都能够被GC干掉,所以排除)



还有其他菜单供选择

  • List objects with (以Dominator Tree的方式查看)
  • incoming references 引用到该对象的对象
  • outcoming references 被该对象引用的对象
  • Show objects by class (以class的方式查看)
  • incoming references 引用到该对象的对象
  • outcoming references 被该对象引用的对象

当你按上面操作之后,凶手就出现了,原来是UserManger的实例。


还有可以通过包名来查看Histogram。


还有更强大的,通过OQL语句查询,有点像写SQL语句。



是不是分分钟查出MainActivity有两个对象。哈哈!
比如:查找size=0并且未使用过的ArrayList

select * from java.util.ArrayList where size=0 and modCount=0

这个地方可以多研究研究。

二、Dominator Tree(支配树)

Dominator Tree是对象之间dominator关系树。如果从GC Root到达Y的的所有path都经过X,那么我们称X dominates Y,或者X是Y的Dominator Dominator Tree由系统中复杂的对象图计算而来。从MAT的dominator tree中可以看到占用内存最大的对象以及每个对象的dominator。 我们也可以右键选择Immediate Dominator”来查看某个对象的dominator。它可以将所有对象按照Heap大小排序显示, 这样大内存对象就是排在前几名的,我们可以搜索大内存对象通向GC Roots的路径,因为内存占用越高的对象越值得怀疑,使用方法跟Histogram(直方图)差不多,在这里我就不做过多的介绍了。

三、内存快照对比

我们可以将test1.hprof的直方图与test2.hprof的直方图对比来看,其中Object#0是test1.hprof的,Object#1是test2.hprof的,通过比较看哪一些对象的大小相差过大。


内存快照对比

其他资料:
官方的帮助文档
http://wiki.eclipse.org/index.php/MemoryAnalyzer

使用 Eclipse Memory Analyzer 进行堆转储文件分析
http://www.vogella.de/articles/EclipseMemoryAnalyser/article.html

MAT使用教程
http://www.vogella.de/articles/EclipseMemoryAnalyser/article.html

转载于:https://www.cnblogs.com/ldq2016/p/8472753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java使用Amazon Simple Queue Service

Amazon Simple Queue Service或SQS是Amazon Webservice堆栈提供的高度可扩展的托管消息队列。 Amazon SQS可用于完全解耦系统中不同组件的操作,这些组件否则将交换数据以执行独立的任务。 Amazon SQS还可以帮助我们保存在应用程序关闭或组件之一不可用时丢失的数据。…

计算机三种引用方式,单元格的引用方式有哪几种

EXCEL单元格的引用包括绝对引用、相对引用和混合引用三种。单元格引用是Excel中的术语,指用单元格在表中的坐标位置的标识。是计算机基础的重要学习内容。1、绝对引用:单元格中的绝对单元格引用(例如$F$6)总是在指定位置引用单元格F6。如果公式所在单元格…

HTML5标签用法及描述

2000 年底,国际 W 3C 织组织公布发行了 X HTML 1.0 版本,到现在已经有 10 年了。这 10 年里, Web 飞速发展,X HTML 1.0 显得“力不从心”,已经跟不上时代的发展了,于是 HTML 5 孕育而生。 W 3C 在 201…

什么是作用域链?

1、简单说就是作用域集合 当前作用域 -> 父级作用域 -> ... -> 全局作用域 形成的作用域链条全局作用域的变量和方法都可以进行调用局部的变量和方法只能局部进行调用( 除闭包外 )局部可以访问全局的变量和方法转载于:https://www.cnblogs.com/wangfencs/p/9446293…

2018 国内 DevOps 趋势分析与实践分享

2017 年年末,《中国第一份 DevOps 年度调查报告》发布,这对国内一直摸着石头过河的 DevOps 先行者和 DevOps 在中国的发展都有着里程碑式的意义。它使国内的 DevOps 先行实践者们既能够对自身的 DevOps 实践有明确定位,又为踌躇不前的观望者们…

linux上php指向mysql_linux环境下 php如何配置mysql

展开全部Linux下配置安装PHP环境参考别人的做法,遇到问题上网查,下面就是安装步骤.一、安装Apache2.2.221、到官网下636f707962616964757a686964616f31333339666133载 http://httpd.apache.org/download.cgi2、解压tar -zxvf httpd-2.2.22.tar.gz3、建立目标文件夹(注意以下所有…

Java 7 Swing:创建半透明和成形的Windows

Java 7 Swing支持具有透明和非矩形形状的窗口。 以下屏幕截图显示了创建的不透明度为75%的圆形窗口。 您可以通过在JFrame上使用setOpacity方法更改其不透明度来创建半透明窗口。 请注意,只有底层操作系统支持时,您才能创建半透明窗口。 另外…

ajax用post方法,jquery中get,post和ajax方法的使用小结

在JQuery中可以使用get,post和ajax方法给服务器端传递数据get方法的使用(customForGet.js文件):function verify(){//1.获取文本框的数据//通过DOM的方式获取//document.getElementByIdx("userName");//通过JQuery的方式获取var jqueryObj $(…

vim使用手册

https://www.cnblogs.com/lijia0511/p/5644566.html转载于:https://www.cnblogs.com/kusy/p/9450311.html

JAVASCRIPT常用20种小技巧汇总

1.TEXTAREA自适应文字行数的多少 2.脚本永不出错<script LANGUAGE"javascript"></script>3.ENTER键可以让光标移到下一个输入框4.预定秒数内自动转到指定网址5.怎么改变滚动条的颜色&#xff0c;只有ie5.5版本以上才能支持。 这是使用CSS语言&#xff0c…

JavaWeb之动态页面技术JSP/EL/JSTL

一、JSP技术 1&#xff0e;jsp脚本和注释 jsp脚本&#xff1a; 1&#xff09;<%java代码%> ----- 内部的java代码翻译到service方法的内部 2&#xff09;<%java变量或表达式> ----- 会被翻译成service方法内部out.print() 3&#xff09;<%!java代码%> ---- 会…

mac mysql创建本地数据库_【mac】配置本地数据库

1.【安装数据库】brew 安装mysql -- brew install mysql安装成功后在命令行敲入 which mysql 查看安装路径2.【配置数据库】如果直接打mysql会报错&#xff0c;需要将mysql添加到环境变量&#xff0c;具体方法参阅后台学习-环境变量检查mysql是否启动 ps -ef | grep mysqld开启…

Spring Integration关键案例与现实生活场景

这篇文章将总结Spring Integration&#xff08;SI&#xff09;的重要要点以及消息传递集成模式。 对于每个关键提示&#xff0c;我都会根据我的经验添加一个真实的示例。 分离器 一个。 它能做什么&#xff1f; 拆分器实际上是一种模式&#xff0c;它在某一点接收一条消息并将…

ie下按keydown事件会触发button

负责公司的一个b2c平台&#xff0c;头部那里有个搜索查询的功能&#xff0c;根据用户输入的内容按回车键也会跳转到响应的页面&#xff0c;后来在ie浏览器下惊奇的发现按回车键的同时它也会触发底部的邮箱订阅的button事件&#xff0c;开始以为是其它的地方用到了回车键从而冲突…

BZOJ3771 Triple(FFT+容斥原理)

思路比较直观。设A(x)Σxai。先把只选一种的统计进去。然后考虑选两种&#xff0c;这个直接A(x)自己卷起来就好了&#xff0c;要去掉选同一种的情况然后除以2。现在得到了选两种的每种权值的方案数&#xff0c;再把这个卷上A(x)。得到这个后考虑去重&#xff0c;其中重复的就是…

糖豆人维修服务器多长时间,服务器不稳定的《糖豆人》凭啥还这么火?只因做到了这三点...

8月4日&#xff0c;《糖豆人&#xff1a;终极淘汰赛》在steam平台上线&#xff0c;不到一周的时间直接登上steam畅销榜第六位。这款看起来似乎并不具备3A制作级别的游戏&#xff0c;到底是怎么获得了这么多玩家的追捧和青睐的呢&#xff1f;不妨跟着汇智妹一起看看这款游戏到底…

MapReduce算法–了解数据联接第1部分

在本文中&#xff0c;我们继续执行一系列实现算法的系列&#xff0c;该算法在使用MapReduce进行数据密集型文本处理中找到&#xff0c;这一次讨论数据联接。 虽然我们将讨论在Hadoop中联接数据的技术并提供示例代码&#xff0c;但在大多数情况下&#xff0c;您可能不会自己编写…

移动端Web开发小记

之前为公司商旅频道写移动端的页面时遇到不少问题&#xff0c;今特来个总结&#xff0c;希望能为后来者带来一些帮助。 不再考虑浏览器兼容性 移动端开发主要对象是手持设备&#xff0c;其中绝大部分是IOS和Android系统&#xff0c;so&#xff0c;在开发此类页面时不必纠结IE…

虚拟机游戏获取服务器地址,vue获取服务器地址

vue获取服务器地址 内容精选换一换Atlas 500 Pro 智能边缘服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 500 Pro 智能边缘服务器 用户指南(型号 3000)》&#xff0c;安装操作系统完成后&#xff0c;配置业务网口IP地址&#xff0c;请参见配…

jar各个版本号的意义

jar版本号的意义&#xff1a; Alpha&#xff1a; Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本&#xff0c;alpha 就是α&#xff0c;beta 就是β &#xff0c;alpha 版就是比 beta 还早的测试版&a…