针对 Activity/Fragment 内存泄漏(静态引用导致),核心问题在于 强引用长期持有组件实例,导致 GC 无法回收。以下从 泄漏原理、典型场景、解决方案、最佳实践 四个维度提供系统化方案,通过以下方案,可彻底解决 90%以上的 Activity/Fragment 静态引用泄漏问题,配合 LeakCanary 等工具持续监控,确保应用在页面切换时无内存残留,提升内存使用效率和稳定性。
一、泄漏核心原理(强引用生命周期失控)
1. 非静态内部类隐式持有外部类强引用
- 原理:Java 非静态内部类(包括匿名内部类)会隐式持有外部类(如 Activity)的
this
引用(强引用)。 - 典型场景:
- 耗时任务(线程/Handler)未在 Activity 销毁前停止,导致内部类长期持有 Activity 引用。
- 自定义监听器(如网络回调、事件总线订阅)未反注册,持有 Activity 引用。
2. 静态变量长期持有上下文引用
- 原理