内存泄漏
一个不会被使用的对象,因为另一个正在被使用的对象持有该对象的引用,所以不能被正常回收,使它停留在堆内存中。
使用静态变量导致内存泄漏
静态变量属于静态存储方式存储,其存储空间为内存中静态区域(在静态存储区内分配存储单元)。程序运行期间一直占用这些存储空间。
单例模式导致内存泄漏
Android 中单例的生命周期和 Application 的生命周期一样,如果在Activity 被单例所持有,那么 activity 就没办法被回收
属性动画导致内存泄漏
如果开启一个属性动画,一直让它播放。会导致内存泄漏
- 解决办法就是 在 onDestroy() 中给属性动画取消 。 onCancel()
WebView 导致内存泄漏
在 onDestroy 中,重置 webView
使用非静态内部类导致内存泄漏
摘自 MG屠夫
1, 非静态内部类的线程生命周期不可控,能否回收完全受线程生命周期决定。如果线程是永久运行的,那么将永远无法回收,就永远无法释放。因为在 Java 中线程是垃圾回收机制的根源,在运行系统中 DVM 虚拟机总会硬件持有所有运行状态的进程的引用,结果导致处于运行状态的线程将永远无法回收
2, 非静态内部类中创建了一个静态实例,导致该实例的生命周期和应用 ClassLoader 级别,又因为该静态实例又会隐式持有其外部类的引用,所以导致其外部类无法正常释放,出现内存泄漏。
解决方案
- 去除隐式引用通过静态内部类去除隐式引用。比如 Android 中的点击事件的处理。要使用静态内部类创建出来,不要使用匿名非静态匿名内部类创建。
- 手动管理对象引用
- 使用若引用