【问题标题】:Microsoft DI Container _transientDisposables not disposed (memory leak)Microsoft DI 容器 _transientDisposables 未处理(内存泄漏)
【发布时间】:2019-10-06 09:52:04
【问题描述】:

我们正在为我们的 asp.net Sitecoer MVC CMS Web 应用程序使用 ASP.NET MS DI 容器。

我们注意到在负载测试期间内存快速增长。查看内存转储,我注意到 _transientDisposable 持有太多 IDisposable 集合。 MS DI 是否应该在 GC 收集时处理这些收集?下面是容器注册。

我的问题:

我的所有服务都注册为 SCOPED(根据请求)。

为什么 ServiceProvider 不处理 IDosable 集合。 MS Container 是否应在请求结束时处理这些集合。

阅读这些线程并没有太多意义。是 MS DI 的错误还是我做的不对:

https://github.com/aspnet/AspNetCore/issues/5496https://github.com/aspnet/DependencyInjection/issues/456

【问题讨论】:

    标签: c# memory dependency-injection ioc-container


    【解决方案1】:

    这可能是由于您(或某些第三方)直接从根 IServiceProvider 解析对象图,而不是从 IServiceScope 解析它造成的。一次性瞬态在作用域内被引用,因此它们可以在作用域结束时被释放。但是,当您从根容器解析时,根容器变成作用域,并且那些一次性瞬态在根容器内被引用,并且只有在根容器被释放时才会被删除。然而,根容器只有在应用程序结束时才会被释放。

    长话短说:使用 MS.DI 时切勿从根容器解析。

    【讨论】:

    • 谢谢。有没有办法告诉我们从根目录解析代码的位置?详细代码sn-p在这个问题上
    • 不,没有。你必须调试。
    • 是否需要 CreateScope 并在 using 块内包装?
    • 它是,如果你没有一个活动范围。
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多