美文网首页
android内存泄漏

android内存泄漏

作者: 口子窖 | 来源:发表于2021-09-16 15:32 被阅读0次

    一、内存泄漏

    描述

    Android 的虚拟机是基于寄存器的 Dalvik,它的最大堆大小一般是 16M,有的机器为 24M。因此我们所能利用 的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现 OutOfMemory 的错误。

    常见的几种内存泄露

    1.java堆内存泄露
    2.没有充足的连续的内存空间
    3.线程数超出了限制
    4.虚拟内存不足

    二、内存泄漏分析工具:

    2.1 使用AndroidStudio 自带的Profiler分析内存是否有泄漏的情况

    clip_image001.png

    2.2 使用leakcanary检测具体的内存泄漏

    dependencies {
     debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
    }
    

    三、线程泄漏分析工具

    首先需要 jcenter:

    repositories {
      jcenter()
    }
    

    然后在您的 project gradle 的 dependencies 中添加:

    classpath "com.codoon.threadtracker:threadtracker-plugin:1.1.0"

    在您的 application gradle 中添加:

    apply plugin: 'com.codoon.threadtracker'
    debugImplementation 'com.codoon.threadtracker:threadtracker:1.1.0'
    

    打包后会多生成一个 TreadTracker 图标,打开即可使用。

    * 如果您的项目尚不支持 androidx,可把以上 version 全部改成 1.0.0;版本 1.1.0 及以后均需 androidx 支持。

    四、内存溢出的几点原因:

    4.1 资源释放问题

    程序代码的问题,长期保持某些资源,如 Context、Cursor、IO 流的引用,资源得不到释放造成内存泄露。

    4.2 对象内存过大问题

    保存了多个耗用内存过大的对象(如 Bitmap、XML 文件),造成内存超出限制。

    4.3 static 关键字的使用问题

    clip_image002.png

    针对 static 的解决方案

    a、应该尽量避免 static 成员变量引用资源耗费过多的实例,比如 Context。
    b、Context 尽量使用 ApplicationContext,因为 Application 的 Context 的生命周期比较长,引用它不会出现内存泄露的问题。
    c、使用 WeakReference 代替强引用。比如可以使用 WeakReference<Context> mContextRef;
    

    4.4 线程导致内存溢出

    clip_image003.png clip_image004.png

    4.5 单例导致的内存泄露

    clip_image005.png
    clip_image006.png

    4.6 非静态内部类导致的内存泄漏

    clip_image007.png

    4.7 handler导致的内存泄露

    clip_image008.png clip_image009.png

    相关文章

      网友评论

          本文标题:android内存泄漏

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