Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测

前言

在 Android 开发中,内存泄漏这个名词我想大家都不陌生,但是真正注意到这个问题并去解决的估计很少,因为内存泄漏表面上并不会表现出对app的任何影响,加之现在的手机配置与内存都挺高的,所以对于中小型app来说,可能不怎么去处理也几乎看不出来,但是作为一名android 开发者,你肯定和我一样不能忍受这种瑕疵吧,那 就撸起袖子干它就完事了

内存抖动 & 内存泄漏 & 内存溢出(OOM)

内存抖动

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

  1. 查看:可以使用android studio自带的profile工具检测。

  2. 现象:在profile中的内存图像就像是心电图一样,忽上忽下,如下图所示:

Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测_第1张图片

  1. 常见场景:循环使用字符串拼接,比如我们项目的日志打印等

  2. 预防内存抖动方法:

  • 避免在循环中创建对象,能复用的尽量复用。
  • 避免在频繁调用的方法中创建对象,如自定义view中的onDraw()等方法中创建画笔。
  • 获取对象尽量从对象池中获取,如Handler获取Message对象应使用obtain()方法获取了。

内存泄漏

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

  1. 查看:使用profile工具检测内存情况,重复执行进入然后退出一个activity,看activity实例是否还存在。如果activity实例还存在,很可能就出现了内存泄漏。

  2. 现象:反复进入A,然后退出A ,执行三次,可以看到A 的实例存在两个。如下图,VideoPlayerActivity:

Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测_第2张图片

这就说明我们的activity并没有被销毁,至少目前是这样的。至于究竟会不会内存泄漏,就需要接下来使用另一款工具配合使用了。

  1. 如何判断内存泄漏:
  • 使用可达性分析法

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

Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测_第3张图片

  1. 何为GC Roots 对象,一般静态变量就是gc root对象,可以理解成生命周期很长的对象。

  2. 如何预防内存泄漏:

  • 使用 软引用、弱引用间接的持有对象的引用。

  • 软引用:

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

你可能感兴趣的:(Android 内存优化篇 - 使用profile 和 MAT 工具进行内存泄漏检测)