Почему Замок Виндзор держится за временные объекты?

Недавно я заметил, что мое приложение ест память, которая никогда не выпускается. После профилирования с помощью CLRProfiler я обнаружил, что контейнер Castle Windsor, который я использую, удерживает объекты. Эти объекты объявлены с атрибутом lifestyle = "transient" в config xml.

Я обнаружил, что если я сделаю явный вызов IWindsorContainer.Release(hangingObject), он откажется от своих ссылок.

Это вызывает проблему, хотя я не ожидал, что с временным объектом образа жизни CastleWindsor сохранит ссылку и эффективно создаст утечку. Это будет довольно обыденная и подверженная ошибкам задача, заключающаяся во вставке явных вызовов Release во всех соответствующих местах.

Вы видели эту проблему, и есть ли у вас какие-либо предложения о том, как ее обойти?

25.09.2008 12:16:08
3 ОТВЕТА
РЕШЕНИЕ

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

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

До версии Castle v 1.0 я полагаю, что компонентное бремя будет внедрено / внедрено, что поможет смягчить некоторые из этих проблем, а также избавиться от введенных зависимостей и т.д.

Редактировать:

Проверьте следующие посты для более подробного обсуждения бремени компонентов.

Компонентное бремя - Дэви Брионс

Также бремя компонентов реализовано в официальной версии 2.0 Windsor Container.

20
11.09.2015 07:33:15

Вы можете установить образ жизни синглтона или переходного процесса, хотя на объектах в контейнере. Я понимаю, что одноэлементные объекты должны существовать в течение всего срока службы приложения, но я не понимаю, насколько полезен этот вид того же самого для переходных объектов!

Пользовательские образы жизни могут быть созданы путем реализации ILifestyleManager. Может быть, это можно реализовать соответствующим образом, чтобы создать ReallyTransientстиль жизни!

1
11.09.2015 07:34:01

Стоит отметить, что это было исправлено в Сундуке Замка. В r5475 Хамметт изменил политику выпуска по умолчанию в MicroKernel на LifecycledComponentsReleasePolicy.

2
11.09.2015 07:33:36