首页 > 解决方案 > Microsoft DI 容器 _transientDisposables 未处理(内存泄漏)

问题描述

我们正在为我们的 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/5496 https://github.com/aspnet/DependencyInjection/issues/456

标签: c#memorydependency-injectionioc-container

解决方案


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

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


推荐阅读