Android 性能优化之基于AndroidStudio和MAT分析内存泄露问题

    MAT(Memory Analyzer Tool) 是基于heap dumps来进行内存分析的工具,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用AndroidStudio和MAT分析内存泄露问题具体步骤如下(以androidStudio3为例,androidStudio2可以用自带的内存分析工具Memory,Dump Java Heap):
1.androidStudio3用Android Profiler导出Heap Dump(.hprof文件),步骤:

(1)、在Android Profiler模块点击Dump Java Heap图标,如下图:

图1 导出heap信息:

(2)、点击Export capture to file,在Export As弹框里面输入生成的后缀为.hprof的文件,如下图:

图2 Export capture to file


图3 保存文件
2.将androidStudio生成的test.hprof 文件转换为MAT可识别的文件,指令如下:
hprof-conv.exe test.hprof out.hprof
3.打开MemoryAnalyzer.exe工具,打开转换格式后的out.hprof文件,点击OQL图标(Open Object Query Language studio to execute Statements)后,在里面输入查询语句:select * from instanceof android.app.Activity(类似于 SQL语句, 将当前内存中所有Activity及其子类都显示出来 )或 SELECT * FROM INSTANCEOF android.app.Activity a WHERE a.mDestroyed = true( 这条语句会返回所有的状态为 destroyed 的 Activity 实例 ;当然可以输入其他查询语句查询你需要的信息,如输入 select * from instanceof android.view.View查询视图view相关的泄露情况;
PS: INSTANCEOF : 用来包含查询指定类的子类进行查询,否则只查询和from部分完全匹配的类;
4.在查询结果中选中需要分析的Activity对象,点击右键,选择Merge Shortest Paths to GC Roots -> exclude all phantom/weak/soft etc.references,在结果中即可以查看到该Activity被引用的情况,从而定位分析泄露原因。
PS:Merge Shortest Paths to GC Roots:可以查看一个对象到RC Roots是否存在引用链相连接, 在JAVA中是通过可达性(Reachability Analysis)来判断对象是否存活,这个算法的基本思想是通过一系列的称谓"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索所走得路径称为引用链,当一个对象到GC Roots没有任何引用链相连则该对象被判定为可以被回收的对象,反之不能被回收;
exclude all phantom/weak/soft etc.references:排查虚引用/弱引用/软引用等,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收。

     总结:如果使用MAT来分析内存问题觉得麻烦,可以考虑使用在源码中接入第三方库LeakCanary,LeakCanary简单迅速的发现内存泄漏问题。Android app开发的过程中内存优化是一个任重道远而且持续不断的过程,作为程序员的我们应该在开发的过程中养成良好的代码编写风格,如善用static关键字,善用WeakReference,使用合适尺寸的bitmap,Cursor和I/O流及时关闭等等,这些习惯养成了,会提高代码效率,同时降低内存泄露的概率。

猜你喜欢

转载自blog.csdn.net/alexlee1986/article/details/80784233