未处理Microsoft DI容器_transientDisposables(内存泄漏)

时间:2019-10-06 09:52:04

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

我们将ASP.NET MS DI容器用于asp.net Sitecoer MVC CMS Web应用程序。

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

enter image description here

我的问题:

我的所有服务均已注册为SCOPED(按请求)。

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

阅读这些线程,并没有太大的意义。是MS DI的错误还是我做不到的事情:

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

1 个答案:

答案 0 :(得分:2)

这可能是由于您(或某些第三方)直接从根IServiceProvider解析对象图而不是从IServiceScope解析对象图引起的。一次性瞬变在示波器内部引用,因此可以在示波器结束时将其丢弃。但是,当您从根容器中进行解析时,根容器将成为作用域,并且那些一次性瞬态将在根容器中被引用,并且只有在放置根容器后才会被删除。但是,根容器仅在应用程序结束时被处置。

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