C#中Scoped实例类的静态变量是否会引发内存泄漏?
问题分析与解答
代码示例
SearchService类实现代码:
public class SearchService : ISearchService { private static Dictionary<long, object> _resultCache = new Dictionary<long, object>(); public SearchService() { _resultCache.Add(new Random().Next(), new Cat()); } }
.NET Core服务注册代码:
service.AddScoped<ISearchService, SearchService>();
核心问题解答
SearchService的Scoped实例可以正常被释放,不会因静态变量无法回收:静态变量
_resultCache属于SearchService类本身,不属于任何单个实例。每个请求生成的Scoped实例,在请求结束后,由于没有被任何存活的引用(静态字典中并未存储SearchService实例本身),GC会正常回收这些实例。但会引发静态集合导致的内存泄漏:静态字典
_resultCache的生命周期与应用程序域(AppDomain)一致,只要程序处于运行状态,它就不会被回收。每次创建SearchService实例时,都会向字典中添加一个新的Cat对象,这些Cat对象会一直被静态字典引用,永远不会被GC回收。随着请求量增加,字典内的对象会持续累积,最终导致内存占用不断上涨,这是典型的静态集合引发的内存泄漏场景。
总结
你的Scoped服务实例能正常被释放,但静态字典会无限制累积Cat对象,造成内存泄漏。如果需要实现缓存逻辑,建议使用.NET框架自带的缓存组件(如IMemoryCache),或者为静态字典添加过期清理机制,避免内存无限制增长。
内容的提问来源于stack exchange,提问作者JKennedy
相关产品推荐
相关产品推荐

