美文网首页
Activity 内存泄漏及优化

Activity 内存泄漏及优化

作者: 张利锋 | 来源:发表于2021-01-05 14:18 被阅读0次

内存泄漏是一个隐形炸弹,其本身并不会造成程序异常,但是随着量的增长会导致其他各种并发症:OOM,UI 卡顿等。

一、为什么会出现内存泄漏(造成内存泄露的几种常见场景)?

1. 将 Context 或者 View 置为 static

View 默认会持有一个 Context 的引用,如果将其置为 static 将会造成 View 在方法区中无法被快速回收,最终导致 Activity 内存泄漏。

2. 未解注册各种 Listener

在 Activity 中可能会注册各种系统监听器,比如广播。

3. 非静态 Handler 导致 Activity 泄漏

一般需要将其置为static,然后内部持有一个Activity的弱引用来避免内存泄漏。

4. 三方库使用 Context

将 Activity 本身当作一个 Context 传递给了一个模拟的三方库 ThirdParty 中,但是在三方库中将传入的 context 重新置为一个静态 static 类型。这种情况是一种隐形的 Activity 泄漏,在我们自己的项目中很难察觉出,所以平时开发过程中,尽量使用 Context.getApplicationContext,不要直接将 Activity 传递给其他组件

二、Activity 内存泄漏检测

在开发阶段安卓工程师可以直接使用 Android Studio 来查看 Activity 是否存在内存泄漏,并结合 MAT 来查看发生内存泄漏的具体对象。
除了 Android Studio 之外,另一个检查内存泄漏的神器就是 LeakCanary

PS: WeakReference相关
Java 中的 WeakReference 是弱引用类型,每当发生 GC 时,它所持有的对象如果没有被其他强引用所持有,那么它所引用的对象就会被回收。
WeakReference 的构造函数可以传入 ReferenceQueue,当 WeakReference 指向的对象被垃圾回收器回收时,会把 WeakReference 放入 ReferenceQueue 中。

LeakCanary 中对内存泄漏检测的核心原理就是基于 WeakReference 和 ReferenceQueue 实现的。

  1. 当一个 Activity 需要被回收时,就将其包装到一个 WeakReference 中,并且在 WeakReference 的构造器中传入自定义的 ReferenceQueue。
  2. 然后给包装后的 WeakReference 做一个标记 Key,并且在一个强引用 Set 中添加相应的 Key 记录
  3. 最后主动触发 GC,遍历自定义 ReferenceQueue 中所有的记录,并根据获取的 Reference 对象将 Set 中的记录也删除

经过上面 3 步之后,还保留在 Set 中的就是:应当被 GC 回收,但是实际还保留在内存中的对象,也就是发生泄漏了的对象。

相关文章

  • Activity 内存泄漏及优化

    内存泄漏是一个隐形炸弹,其本身并不会造成程序异常,但是随着量的增长会导致其他各种并发症:OOM,UI 卡顿等。 一...

  • Android性能优化之内存优化

    导读 读完本篇能学到以下知识 解决Activity的内存泄漏 Bitmap加载优化 前言 内存优化是Android...

  • 性能优化——内存泄漏(3)代码分析篇

    内存泄漏系列文章:性能优化——内存泄漏(1)入门篇性能优化——内存泄漏(2)工具分析篇性能优化——内存泄漏(3)代...

  • 性能优化——内存泄漏(2)工具分析篇

    内存泄漏系列文章:性能优化——内存泄漏(1)入门篇性能优化——内存泄漏(2)工具分析篇性能优化——内存泄漏(3)代...

  • 性能优化——内存泄漏(1)入门篇

    内存泄漏系列文章:性能优化——内存泄漏(1)入门篇性能优化——内存泄漏(2)工具分析篇性能优化——内存泄漏(3)代...

  • android优化

    布局优化 避免过度绘制 绘制优化 内存泄漏优化 响应速度优化 ListView/RecycleView及Bitma...

  • Android_内存泄露

    注意Activity的泄漏 通常来说,Activity的泄漏是内存泄漏里面最严重的问题,它占用的内存多,影响面广,...

  • Android性能优化之内存篇

    android的内存优化一般从以下几个方面考虑: 内存泄漏 内存抖动 Bitmap 代码质量优化 内存泄漏 内存泄...

  • Android性能优化

    1.Android性能优化-内存泄漏(上) 2.Android性能优化-内存泄漏(下) 3.Android性能优化...

  • Android Knowledge

    一. 系统优化 1.1 内存泄漏优化 1.1.1 静态变量导致内存泄漏 public static Contex...

网友评论

      本文标题:Activity 内存泄漏及优化

      本文链接:https://www.haomeiwen.com/subject/ntgioktx.html