Почему замок Виндзор держится за временные объекты?
Недавно я заметил, что мое приложение, похоже, есть память, которая никогда не выпускается. После профилирования с помощью CLRProfiler я обнаружил, что контейнер Castle Windsor, который я использую, удерживает объекты. Эти объекты объявляются с атрибутом lifestyle = "переходный" в config xml.
Я обнаружил, что если я ставлю явный вызов IWindsorContainer.Release(hangingObject)
, он поместит его ссылки.
Это вызывает проблему, хотя я не ожидал, что с помощью объекта временного образа жизни CastleWindsor сохранит ссылку и эффективно создаст утечку. Это будет довольно обыденная задача, связанная с ошибкой, которая собирается вставлять явные вызовы Release во всех соответствующих местах.
Вы видели эту проблему, и есть ли у вас какие-либо предложения о том, как обойти ее?
Ответы
Ответ 1
Я думаю, что в ответах здесь отсутствует жизненно важный момент: это поведение настраивается из коробки посредством политик выпуска - проверьте документацию на сайте проекта замка .
Во многих сценариях, особенно в тех случаях, когда ваш контейнер существует на протяжении всего срока действия приложения-хостинга, и где переходные компоненты действительно не нужно отслеживать (поскольку вы обрабатываете удаление в своем кодовом коде или компоненте, который был введен с помощью службы), то вы можете просто установить политику выпуска в реализацию NoTrackingReleasePolicy
и сделать с ней.
До замка v 1.0 я верю, что компонентное бремя будет внедрено/внедрено - что поможет облегчить некоторые из этих проблем, а также об утилизации вложенных зависимостей и т.д.
Edit:
Ознакомьтесь со следующими сообщениями, чтобы узнать больше о нагрузке на компонент.
Компонентное бремя - Дэви Брионс
Также компонентная нагрузка реализуется в официальном выпуске 2.0 в контейнере Windsor.
Ответ 2
Следует отметить, что это, по-видимому, было зафиксировано в Замковой башне. В r5475 Хамметт изменил политику выпуска по умолчанию в MicroKernel на LifecycledComponentsReleasePolicy
.
Ответ 3
Вы можете установить образ жизни одиночного или переходного, но на объекты в контейнере. Синглтон-объекты, которые, как я понимаю, должны длиться всю жизнь приложения, но я не понимаю, насколько полезность этого поведения одинакова для переходных!
Пользовательский образ жизни может быть создан путем реализации ILifestyleManager
. Возможно, это возможно реализовать таким образом, чтобы создать стиль стиля ReallyTransient
!