Dagger中Singleton作用域DI_O对象在Activity销毁后能否被GC?
@Singleton对象DI_O的垃圾回收问题解析
这个问题其实戳中了Dagger单例生命周期的核心点,我来给你掰扯清楚:
核心结论:要看你的Dagger组件绑定的生命周期
Dagger里的@Singleton并不是真的“全局唯一到天荒地老”,它的存活时间是和它所属的Dagger组件绑定在一起的,和Fragment、Activity的生命周期没有直接绑定关系,分两种常见情况:
1. 常规Activity销毁(非配置变更场景)
- 如果你的
@Singleton对象是绑定在Application级组件里(这是Dagger默认推荐的@Singleton使用方式):那DI_O会一直存活到整个应用进程被杀死,哪怕Activity和Fragment销毁了,组件还持有DI_O的引用,GC根本碰不到它。 - 如果你误用了
@Singleton(比如在Activity级组件里标注了@Singleton而不是自定义的@ActivityScope):这种情况下DI_O的生命周期和Activity组件绑定,Activity销毁时组件被回收,DI_O失去引用后就会被GC回收。不过这属于不规范用法,Dagger里@Singleton应该对应Application级别的组件范围。
2. 配置变更导致的Activity销毁(比如旋转屏幕、开启“不保留活动”后最小化)
- 还是Application级组件的情况:DI_O完全不受影响,该干嘛干嘛,依然稳稳存活在组件里,不会被GC。
- 如果是Activity级组件:
- 要是你没做特殊处理(比如没通过ViewModel持有组件):Activity销毁时组件跟着被回收,DI_O会被GC。
- 要是你用ViewModel持有了Activity级组件:组件会跟着ViewModel存活到新的Activity实例,DI_O也会继续存活,不会被GC。
背后的逻辑
Dagger的@Singleton注解本质是个范围标记,告诉Dagger“这个对象在当前组件的生命周期里只创建一次”。Application级组件的生命周期和应用进程完全同步,只要进程活着,组件就会持有单例的引用,GC无法回收;而Fragment/Activity的销毁只是它们自身实例被回收,不影响组件对单例的持有。
实际验证小提示
当你用“不保留活动”模拟场景时,可以用Android Studio的内存分析工具(Profiler)来看:
- Application级单例:DI_O的实例会一直存在,直到你手动杀死应用进程。
- 未被保留的Activity级组件:Activity销毁后,过一会儿GC触发,就能看到DI_O的实例被回收了。
内容的提问来源于stack exchange,提问作者lannyf
相关产品推荐
相关产品推荐

