外观
如何理解MAT 与 Activity 引用链?
标准回答
在可控场景重复打开和关闭页面,选择合理的稳定点获取堆转储。先看Histogram确认Activity实例异常,再用Dominator Tree和到GC Root的引用路径找谁在保留它。
常见路径是静态集合、长生命周期单例、尚未执行的Handler消息、监听器或回调持有页面。要判断业务生命周期已经结束且引用本应解除;页面暂存、缓存或转场期间有引用不一定是泄漏。
修改引用的所有权或解绑时机,再用同样循环验证实例和保留内存是否恢复。MAT看到的是Java引用图;若内存来自Native分配或图形资源,要补其他工具。
追问与回答
Retained Size 与 Shallow Size有什么区别
Shallow是对象自身占用;Retained是该对象不可达后,可因其支配关系一起释放的那部分对象规模。不要把所有可达对象大小直接相加,其他根可能还保留它们。
怎么处理软弱引用
根据分析目标排除弱/软引用等路径,再确认真正阻止回收的强引用。看到任意路径并不等同于强泄漏。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q053