Android内存泄露-简单分析

一.什么是内存泄露

Android 内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到 gc roots 导致无法被 GC 回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。

泄露场景:

1.类的静态变量持有大数据对象

静态变量长期维持到大数据对象的引用,阻止垃圾回收。

2.非静态内部类的静态实例

非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。

3.资源对象未关闭

资源性对象如Cursor、File、Socket,,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。

4.Handler临时性内存泄露

Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上被处理的。在Message中存在一个target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收,如果Handler是非静态的,则会导致Activity或者Service不会被回收。

由于AsyncTask内部也是Handler机制,同样存在泄露风险。

预防

不要维持到Activity的长久引用,对activity的引用应该和activity本身有相同的生命周期。

尽量使用context-application代替context-activity。

Activity中尽量不要使用非静态内部类,可以使用静态内部类和WeakReference代替。

监测

静态检测

静态检测主要是检测资源未关闭的情况,Eclipse 和 Android Studio 都可以检测出 IO 或者 Socket 未关闭的情况,然后在 finally 中关闭即可。

动态监测

动态检测主要是依靠MAT这个工具,或者查看AndroidStudio中的Monitors 或者采用三方库LeakCanary等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识 1、什么是内存泄露 java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放...
    LiveMoment阅读 4,483评论 0 20
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,660评论 0 8
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,247评论 2 7
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 812评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,143评论 25 709