外观
内存泄漏与线程泄漏是一回事吗?
标准回答
两者不是一回事。内存泄漏强调“不再需要的对象还被引用,无法回收”;线程泄漏强调“不再需要的线程或执行器还没结束”。线程可能同时持有页面对象,所以同一问题也可能造成两种泄漏。
- 长期运行的线程可能持有 Activity,引发内存泄漏。
- 无用线程也会消耗栈空间、调度资源或 CPU,但不一定持有 Activity。
- 分别检查 heap 的引用链与线程数量、栈和任务生命周期。
通俗例子
页面关了,轮询线程还在跑,这是线程生命周期没收好;如果线程还抓住 Activity,又会把页面内存一起留住。
深入解释
**泄漏的对象不同:**内存泄漏是本应释放的对象仍被无用引用留住;线程泄漏是本应结束的线程或执行器继续存在、等待或运行,持续占用线程栈等资源。
**二者为什么经常一起出现:**页面创建线程却不退出,线程任务又持有页面,就同时浪费线程和保留 Activity。线程没泄漏也可能有静态集合导致的内存泄漏,因此要分别检查。
易混淆点
二者会相互关联,但不能互相等同;取消任务也需要任务实现协作退出。
参考资料
内容来源
- Android · AI Agent 知识手册 · 原条目
4.6.1