内存泄漏的定义和解决方法
1 内存泄漏的定义
内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费(根本:!!一个对象在需要释放的时候还在被别的对象引用,这个时候就无法顺利释放内存)
2 为什么会产生内存泄漏
当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏。**
3 内存泄漏对程序的影响
内存泄漏是造成应用程序OOM(程序申请内存过大,程序捕获异常弹窗失败)的主要原因之一。我们知道Android系统为每个应用程序分配的内存是有限的,而当一个应用中产生的内存泄漏比较多时,这就难免会导致应用所需要的内存超过系统分配的内存限额,这就造成了内存溢出从而导致应用Crash。
4 如何检查分析内存泄漏
因为内存泄漏是在堆内存中,所以对我们来说并不是可见的。通常我们可以借助MAT、LeakCanary等工具来检测应用程序是否存在内存泄漏。
5 面试会问那种情况会造成内存泄露
①线程造成的内存泄漏
②资源未关闭造成的内存泄露
③集合容器的未释放造成的内存泄漏
6 如何避免内存泄漏
①对对象生命周期的敏感,特别注意单例、静态对象、全局性集合等的生命周期(面试时回答注意软件生命周期即使摧毁和释放)。
②将内部类改为静态内部类,静态内部类中使用弱引用来引用外部类的成员变量(面试回答将一些类转化为静态内部类)