1.定义
Android (或 JVM)的内存泄露:短?命周期的对象被??命周期的对象持有,从?导致短?命周期的对象不能被释放
2.垃圾回收机制
垃圾回收机制分为「引?计数法」和「可达性分析法」:
- 「引?计数法」
Python , Object-C , Swift ??个计数器记录?个对象被引?的次数,如果引?的次数被减少到 0 那么说 明这个对象是垃圾 对象。 都是引?计数(引?计数有循环引?的问题) - 「可达性分析法」 Java
Jvm 通过?些 GC Roots 向下搜索,如果可以被 Gc Roots 引?到的对象,说明 这个对象不是垃圾对象,反之这个对象就算互相引?了也是垃圾对象。 哪些对象会被作为 GC Roots 呢?
- 在线程栈中的局部变量,也就是正在被调?的?法,它??的参数和局部变
量 - 存活的线程对象
- JNI 的引?
- Class 对象,因为 Android 加载 Class 后不会卸载 Class
- 引?类型的静态变量
3.内存泄露导致的问题
内存泄漏并不会?上把程序搞挂掉。但是随着应?的使?,不能回收的垃圾对象会越来越多,就导致了 可?的内存越来越少,到最后应?就有可能在任何位置抛出OutOfMemoryError ,这种情况下,每次 OOM 错误堆栈都不同,就很难定位问题。
4.四?引?
- 强?点的引?
强引?——不会被垃圾回收 - 弱?点的引?
弱引?——可以通过 get() 获得引?对象,会被垃圾回收 软引?——可以通过 get() 获得引?对象,内存不?会被垃圾回收 虚引?——不能通过 get() 获得引?对象,会被垃圾回收
5.实现检测内存泄漏思路
将对象添加到弱引用中,当弱引?在引?对象被垃圾回收之前,会将引?放?它关联的队列中。 可以通过队列中是否有对应的引?来判断对象是否被垃圾回收了。
|