1.背景

在开发App的过程中我们会经常遇到内存抖动或者内存泄露的问题,我们需要用一些常用的工具去定位这些问题

2.内存抖动

2.1定义

短时间内有大量对象创建销毁,它伴随着频繁的GC

2.2检测方式 :

Profiler

例子

点击后创建大量字符串对象
内存泄露与内存抖动排查策略

内存泄露与内存抖动排查策略
我们打开AndroidStudio在有问题的地方划上一个区域,下边会弹出一个对应的对象,你评估哪些对象个数是不合理的,像上面的例子就是String 是不合理的,一段时间内出现了2000多个,点击字符串会出现右上角的对象,再点击右上角会出现代码在哪一行创建的,可以定位创建的地点,就可以定位解决问题了。

2.3预防

(1)避免在循环中创建对象;
(2)避免在频繁调用的方法中创建对象,如View的onDraw方法;
(3)允许复用的情况下,使用对象池进行缓存,如:Handler的Message单链表(obtain)

3.内存泄露

程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。
长生命周期对象持有短生命周期对象强引用,从而导致短生命周期对象无法被回收!

3.1原理 可达性分析法

通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的

内存泄露与内存抖动排查策略

3.2软引用,弱引用

软引用:定义一些还有用但并非必须的对象。对于软引用关联的对象,GC不会直接回收,而是在系统将要内存溢出之前才会触发GC将这些对象进行回收。
弱引用:同样定义非必须对象。被弱引用关联的对象在GC执行时会被直接回收。

3.3 检测方式

3.3.1 采用memory profile方式

内存泄露与内存抖动排查策略

故意写了一个handler 内存泄露

内存泄露与内存抖动排查策略

内存泄露与内存抖动排查策略

我取一些样本比如我们保存为 15.hprof 然后我们需要用Android SDK自带的 hprof-conv 环境怎么配我就不说了
内存泄露与内存抖动排查策略

然后我们使用命令
hprof-conv -z 15.hprof 16.hprof 转换一下 然后用 elipse的mat 打开 一下 mat 没有的去下载就可以了

内存泄露与内存抖动排查策略

点击 histogram ,搜索你的Activity 比如 上面例子是HomeActivity

内存泄露与内存抖动排查策略
我把他们的各种引用关系去掉

内存泄露与内存抖动排查策略
内存泄露与内存抖动排查策略
如果这个时候还存在引用关系的话 那么就说明这个Activity是存在内存泄露的。
如果把上边的handler 延时去掉 应该是不会出现这引用的,
内存泄露与内存抖动排查策略
我们可以用这种方式去判断是否存在这个Activity

相关文章: