核心是切断强引用链以确保短生命周期对象及时回收,关键在于持有方式可控、可解绑且不阻碍gc:优先用weakhashmap、weakreference等弱引用容器,限制作用域,显式清理,并规避context泄漏。

核心是切断强引用链,让短生命周期对象能被及时回收。关键不在“不持有”,而在“持有方式可控、可解绑、不阻碍GC”。
用弱引用容器替代强引用集合
当确实需要暂存 View、Activity、Callback 等短生命周期对象时,避免用 ArrayList
- 改用 WeakHashMap
存储以 View 为 key 的映射,GC 可随时回收 key - 用 ArrayList
> 替代 ArrayList,访问前必须判空: ref.get() != null - 禁止在单例、ViewModel 或静态字段中直接保存 Activity.this、Fragment 实例或匿名内部类(如 new OnClickListener())
把容器限制在局部代码块内
不提升为成员变量,让容器随方法结束自动失效:
- 在 Activity 的某个点击处理方法里,声明
List<view> tempViews = new ArrayList();</view>,仅用于本次动画,执行完立即清空或任其出作用域 - 避免写成
private List<view> cachedViews;</view>—— 即使后续清空,也已延长了 View 的存活时间 - Kotlin 中善用
view?.let { ... }或run { ... },配合局部变量进一步收窄引用范围
在生命周期终点显式清理
若容器不得不成为成员变量(如需跨方法协作),必须配对清理:
- Activity 中:在 onDestroy() 清空 WeakReference 列表、移除 Handler 回调、注销 BroadcastReceiver
- ViewModel 中:在 onCleared() 调用
container.clear(),并取消协程 Job、停止 Flow 收集 - 自定义 Manager 类:提供 destroy() 方法,并由 Fragment 在
onDestroyView()后主动调用
初始化阶段就规避 Context 泄漏
单例、工具类、SDK 封装器等长生命周期组件,绝不接收 Activity Context:
- 构造或初始化时只取 getApplicationContext(),且不缓存传入的任意 Context
- 静态内部类(如 Handler、Runnable)不能隐式持有外部 Activity,应改为静态 + WeakReference
- 第三方 SDK 注册监听后,务必在对应组件销毁时调用 unregister,不能依赖“系统自动清理”











