android内存泄漏
2021-09-16 本文已影响0人
口子窖
一、内存泄漏
描述
Android 的虚拟机是基于寄存器的 Dalvik,它的最大堆大小一般是 16M,有的机器为 24M。因此我们所能利用 的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现 OutOfMemory 的错误。
常见的几种内存泄露
1.java堆内存泄露
2.没有充足的连续的内存空间
3.线程数超出了限制
4.虚拟内存不足
二、内存泄漏分析工具:
2.1 使用AndroidStudio 自带的Profiler分析内存是否有泄漏的情况
clip_image001.png2.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.png4.5 单例导致的内存泄露
clip_image005.pngclip_image006.png