在进行应用内存优化和泄漏处理的时候,有一些工具非常重要。归纳最重要的三个如下:
Memory Monitor的使用
说到app的内存分析,第一大应该学会使用的就是Memory Monitor,这是一个集成在AS(Android studio)上的一个工具。


- A:initiate GC 手动触发GC操作;
- B:Dump Java Heap 获取当前的堆栈信息,生成一个.hprof文件,AndroidStudip会自动使用HeapViewer打开;一般用于操作之后检测内存泄漏的情况;
- C:Start Allocation Tracking 内存分配追踪工具,用于追踪一段时间的内存分配使用情况,能够知道执行一些列操作后,有哪些对象被分配空间。一般用于追踪某项操作之后的内存分配,调整相关的方法调用来优化app性能与内存使用;
- D:剩余可用内存;
-
E:已经使用的内存。
新式的在profile里面
在视图框里右键dump memory heap
点击Memory Monitor的Dump Java Heap,会生成一个.hprof文件,AndroidStudio会自动使用HeapViewer打开。

左面板说明:
Total Count 该类的实例个数
Heap Count 选定的Heap中实例的个数
Sizeof 每个实例占用的内存大小
Shallow Size 对象本身占用的内存
Retained Size 由于对象无法释放,被间接hold住的内存。
如上图:
- 通体查看,根据Allocations 列,由大到小排序,从上到下,终点关注那些非java原生的部分
- 点击沙漏,输入此应用包名:结合业务逻辑,如短尖头所指的ActivityAdvertising的活动存在较大嫌疑,这是一个启动页,用来展示广告,之后进入主应用,而这里有
使用MAT(Memory Analyzer 内存分析器)
MAT设计的初衷并非是分析Android应用程序的内存,主要作用是分析Java类型应用程序内存的。所以从java转过来的一批Android工程师比较熟悉这个。MAT在分析内存方面更为精细。(在传音控股的时候,公司里主要采用mat查看)
使用MAT需要抓取Hprof文件(内存快照),
1)得到Hprof文件,方法有三种:
1.使用DDMS的Dump Hprof file 来抓取。
- adb shell 模式下使用am dumpheap pid outfilePath 命令抓取。
- 往测试要(不用带大刀片子)
2)将生成的.hprof文件进行转换
抓取的文件在手机的 /data/misc文件夹下,将其转移到电脑上。
打开cmd,使用转换命令:hprof-conv 原文件路径 转换后文件路径

tips: 我本人会使用同一个目录,将其后缀名添加几个字符,以示区分。
3) 用MAT工具打开转换后的文件
点击树形目录,可以看到相关引用。可以在面板中进行一下操作:
1. 搜索框里的技巧
1>在最上方的搜索框里进行搜索排除,输入的关键字,可以来自,leakcanary,因为这是我们重点关注的,也是泄露的点
2> 在这个搜索框里搜索相关的Activity,或者直接输入Activity,查看搜索结果,Objects列里面的个数,倒叙排列,看那些有多个Activity,多个Activity一般是不太正常的。
3> leankcanry 报出的泄露是关于那个类的,将类名输入进去,排除弱引用,观察对象的持有情况
4> 通体查看的时候,进行倒叙排列,输入包名,过滤。如果有使用混淆,那些特殊字符的就是我们自己的代码,可以拿到map文件,找到对应的类。
2. 鼠标操作
1>对想要查看的对象实例点击右键-> Path To Gc Roots -> exclude weak reference(排除掉软引用)。

2> 点击树状目录,查看引用关系
3. 对两个hprof文件进行对比
1> hprof特别对内存持续增长有大疗效。比如内存持续增长的开始结尾我们抓取了快照。在结尾的时候,我们看到那些还停留在内存中。结合我们的应用逻辑发现他是不必要的,那么就可以加以分析,一定是泄漏了。
LeakCanary
LeakCanary是square出品的一个检测内存泄漏的库,集成到App之后便无需关心,在发生内存泄漏之后会Toast、通知栏弹出等方式提示,可以指出泄漏的引用路径,而且可以抓取当前的堆栈信息供详细分析。
- 集成方法见网络,非常简单,重点是查看方法:
部分查看的方法见:https://www.jianshu.com/p/f8270f9429ce
泄漏日志的头部
以上是泄漏日志的开头和结尾,结尾处,无重要信息。这里要看开头。
网友评论