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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:04:50