android内存管理

Android内存泄漏快速解决——三大工具

2020-01-14  本文已影响0人  朱_c713

在进行应用内存优化和泄漏处理的时候,有一些工具非常重要。归纳最重要的三个如下:

Memory Monitor的使用

说到app的内存分析,第一大应该学会使用的就是Memory Monitor,这是一个集成在AS(Android studio)上的一个工具。

image.png image.png 点击沙漏部分,输入我们的包名

左面板说明:

Total Count 该类的实例个数
Heap Count 选定的Heap中实例的个数
Sizeof 每个实例占用的内存大小
Shallow Size 对象本身占用的内存
Retained Size 由于对象无法释放,被间接hold住的内存。

如上图:

  1. 通体查看,根据Allocations 列,由大到小排序,从上到下,终点关注那些非java原生的部分
  2. 点击沙漏,输入此应用包名:结合业务逻辑,如短尖头所指的ActivityAdvertising的活动存在较大嫌疑,这是一个启动页,用来展示广告,之后进入主应用,而这里有

使用MAT(Memory Analyzer 内存分析器)

MAT设计的初衷并非是分析Android应用程序的内存,主要作用是分析Java类型应用程序内存的。所以从java转过来的一批Android工程师比较熟悉这个。MAT在分析内存方面更为精细。(在传音控股的时候,公司里主要采用mat查看)
使用MAT需要抓取Hprof文件(内存快照),

1)得到Hprof文件,方法有三种:

1.使用DDMS的Dump Hprof file 来抓取。

  1. adb shell 模式下使用am dumpheap pid outfilePath 命令抓取。
  2. 往测试要(不用带大刀片子)

2)将生成的.hprof文件进行转换

抓取的文件在手机的 /data/misc文件夹下,将其转移到电脑上。
打开cmd,使用转换命令:hprof-conv 原文件路径 转换后文件路径


用转换命令转换hprof

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、通知栏弹出等方式提示,可以指出泄漏的引用路径,而且可以抓取当前的堆栈信息供详细分析。

以上是泄漏日志的开头和结尾,结尾处,无重要信息。这里要看开头。

Android内存泄漏解决(总)

上一篇 下一篇

猜你喜欢

热点阅读