外观
内存泄漏、内存抖动、OOM 有什么区别?
标准回答
泄漏是对象已经不需要却仍被可达引用留住;抖动是短时间大量分配和回收;OOM 是内存分配失败,既可能由泄漏累积,也可能由一次超大申请导致。
关键机制
- GC Roots 能直接或间接到达的对象通常不会被回收。排查泄漏要找引用链,而不是只看对象数量。
- 常见泄漏来源:静态引用 Activity、未解绑监听、长任务捕获页面、未结束的线程。生命周期结束时解除关联。
- 大图片按显示尺寸解码;缓存要有上限;看 Java / native / graphics 等内存,堆大小并不代表全部进程占用。
通俗例子
单例保存一个页面 Listener,Listener 又引用 Activity。页面退出后仍可达,就可能泄漏;改成明确注册和解绑,而不只是把引用换成弱引用。
易混淆点
线程泄漏是线程或任务没有按预期结束,可能进一步造成对象泄漏、CPU 和功耗异常;它不等同于所有内存泄漏。
参考资料
内容来源
- Android 技术札记 · 原条目
memory