Утечки памяти при использовании Entity Framework и Windsor в приложении ASP.NET MVC - PullRequest
3 голосов
/ 19 ноября 2010

У меня возникли проблемы с совместной работой контейнера windsor и сущности, и это может быть связано с проблемой, которую я представил, но в результате я получаю ужасные утечки памяти.

У меня настроено приложение с EDMX и репозиториями и сервисами, а для него и для objectcontext задан perwebrequest в используемом мной файле конфигурации windsor. Однако, когда я смотрю на использование памяти в профилировщике памяти ANTS, я вижу, что кэш контекста объекта все еще сохраняется как ссылка с кешем, несмотря на подтверждение вызова Dispose.

И при каждом запросе все больше динамических прокси зависают в памяти. Если кому-то еще удастся получить подобный рассол, и он может дать мне совет, как с этим справиться, это будет с благодарностью.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

Мне удалось отследить и решить проблему, изменив настройки выпуска в ядре для контейнера windsor на:

_container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();

Кажется, хотя контейнер windsor вызывает метод dispose для компонентов perwebrequest, он все еще привязывается к ним, что предотвращает их сборку мусора.

В этом случае объект, на который он ссылался, имел тип ObjectContext. К сожалению, несмотря на удаление этого объекта, все динамические прокси, кэшированные в этом объекте, все еще остаются эффективно, что означает, что копия моей базы данных (или, по крайней мере, частей, к которым я обращался) добавлялась в память каждый запрос, вызывая ее увеличение. *

2 голосов
/ 19 ноября 2010

Вы, вероятно, неправильно выбрасываете предметы. Попробуйте использовать блоки «Using».

Не могу сказать гораздо больше, не увидев код.

1 голос
/ 31 августа 2012

У меня была такая же проблема.

После расследования мне показалось, что я пропускаю вызов _container.Release (controller) на моей фабрике контроллеров:

    public override void ReleaseController(IController controller)
    {
        _container.Release(controller);

        var disposable = controller as IDisposable;
        if (disposable != null)
        {
            disposable.Dispose();
        }
    }

Однако я былтакже использование Windsor 2.1 и добавление _container.Release (контроллер) ничего не сделал для меня.

После обновления до версии 3.1, похоже, работает.

Надеюсь, это поможет.

ps ANTS Memory Profiler - спасатель жизни!

...