android内存泄漏

2021-09-16  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读