You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否应在单例模块中安装实例变量依赖?遗漏@Singleton会致内存泄漏吗?

关于Hilt中遗漏@Singleton注解的内存泄漏问题

首先明确结论:不会直接触发内存泄漏,但可能造成不必要的内存浪费,仅在特定场景下存在泄漏风险

1. Hilt的作用域规则解析

当你将@Provides方法安装在SingletonComponent但未添加@Singleton注解时,这个依赖属于无作用域(unscoped)绑定:

  • 每次注入该依赖时,Hilt都会创建一个全新的实例,不会复用已有实例
  • SingletonComponent的生命周期与应用一致,但无作用域的实例并不会和组件绑定生命周期——它们的存活时长由请求它们的消费者(如Activity、Fragment)决定,除非被其他长生命周期对象持有

2. 内存泄漏的触发场景

  • 无风险场景:如果依赖是无状态的纯业务类(比如示例中的MyApiImpl,仅封装网络请求逻辑,未持有任何外部引用),那么即使每次创建新实例,当消费者销毁后,这些实例会被GC正常回收,不会产生泄漏,只是会额外占用少量内存。
  • 有风险场景:如果该实例持有了短生命周期对象的引用(如Activity的Context、View),同时又被SingletonComponent中的单例依赖或持有,那么单例会一直保留这个实例的引用,导致实例中的短生命周期对象无法被回收,最终引发内存泄漏。

3. 最佳实践

  • 如果依赖需要全局复用(如API实例、数据库实例),务必添加@Singleton注解,确保Hilt只创建一次实例,避免内存浪费和潜在泄漏。
  • 如果不需要全局复用,建议将依赖安装在更匹配的组件中(如ActivityComponent),让实例生命周期与对应组件绑定,更符合生命周期管理逻辑。

内容的提问来源于stack exchange,提问作者the_prole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:27:13