androidStudio2可以用自带的内存分析工具Memory,Dump Java Heap):

1.androidStudio3用Android Profiler导出Heap Dump(.hprof文件),步骤:


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

android studio内存分配 android studio内存分析工具_android

图1 导出heap信息:

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


android studio内存分配 android studio内存分析工具_内存泄露_02

图2 Export capture to file

android studio内存分配 android studio内存分析工具_内存分析_03


图3 保存文件


2.将androidStudio生成的test.hprof 文件转换为MAT可识别的文件,指令如下:


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给回收。