Контейнер Microsoft DI _transientDisposables не удален (утечка памяти) - PullRequest
0 голосов
/ 06 октября 2019

Мы используем контейнер ASP.NET MS DI для нашего веб-приложения asp.net Sitecoer MVC CMS.

Мы заметили, что во время нагрузочного тестирования память быстро растет. Просматривая дамп памяти, я заметил, что _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 Ответ

2 голосов
/ 07 октября 2019

Вероятно, это вызвано тем, что вы (или какая-либо третья сторона) разрешаете графы объектов непосредственно из корня IServiceProvider вместо того, чтобы разрешать его из IServiceScope. На одноразовые переходные процессы ссылаются внутри области действия, чтобы их можно было удалить после окончания области действия. Однако при разрешении из корневого контейнера корневой контейнер становится областью действия , и на эти одноразовые переходные процессы ссылаются внутри корневого контейнера, и они будут удалены только после удаления корневого контейнера. Однако корневой контейнер удаляется только после завершения работы приложения.

Короче говоря: никогда не разрешать из корневого контейнера при использовании MS.DI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...