Skip to content
阅读进度

内存泄漏、内存抖动、OOM 有什么区别? ​

返回 性能与稳定性 目录

标准回答 ​

泄漏是对象已经不需要却仍被可达引用留住;抖动是短时间大量分配和回收;OOM 是内存分配失败,既可能由泄漏累积,也可能由一次超大申请导致。

关键机制 ​

  • GC Roots 能直接或间接到达的对象通常不会被回收。排查泄漏要找引用链,而不是只看对象数量。
  • 常见泄漏来源:静态引用 Activity、未解绑监听、长任务捕获页面、未结束的线程。生命周期结束时解除关联。
  • 大图片按显示尺寸解码;缓存要有上限;看 Java / native / graphics 等内存,堆大小并不代表全部进程占用。

通俗例子 ​

单例保存一个页面 Listener,Listener 又引用 Activity。页面退出后仍可达,就可能泄漏;改成明确注册和解绑,而不只是把引用换成弱引用。

易混淆点 ​

线程泄漏是线程或任务没有按预期结束,可能进一步造成对象泄漏、CPU 和功耗异常;它不等同于所有内存泄漏。

参考资料 ​

内容来源 ​

用完整回答理解机制,用真实证据解释项目。