30

最近我注意到我的应用程序似乎正在消耗永远不会被释放的内存。在使用 CLRProfiler 进行分析后,我发现我正在使用的 Castle Windsor 容器正在固定对象。这些对象在配置 xml 中使用 Lifestyle="transient" 属性声明。

我发现如果我明确调用IWindsorContainer.Release(hangingObject),它将删除它的引用。

虽然这会导致问题,但我没想到CastleWindsor 使用瞬态生活方式对象会保留引用并有效地造成泄漏。在所有适当的地方插入显式的 Release 调用将是一项相当平凡且容易出错的任务。

你有没有看到这个问题,你对如何解决这个问题有什么建议吗?

4

3 回答 3

21

我认为这里的答案遗漏了一个关键点——这种行为可以通过发布策略开箱即用地配置——在此处查看城堡项目网站上的文档。

在许多情况下,特别是在您的容器在托管应用程序的生命周期中存在的情况下,并且瞬态组件确实不需要跟踪(因为您正在处理调用代码或已注入服务的组件中的处置)然后您只需将发布策略设置为NoTrackingReleasePolicy实现并完成即可。

在 Castle v 1.0 之前,我相信 Component Burden 将被实施/引入 - 这将有助于缓解其中一些问题以及围绕注入依赖项的处置等。

编辑:

查看以下帖子,了解有关组件负担的更多讨论。

组件负担 - Davy Brions

在 Windsor Container的官方 2.0 版本中也实现了组件负担。

于 2008-10-03T12:07:13.413 回答
2

需要注意的一件事是,这似乎已在 Castle Trunk 中修复。在 r5475 中,Hammett 将 MicroKernel 中的默认发布策略更改为LifecycledComponentsReleasePolicy.

于 2009-03-25T17:44:43.760 回答
1

您可以在容器中的对象上设置单例或瞬态的生活方式。我理解的单例对象应该持续应用程序的生命周期,但我不明白这种行为对于瞬态对象的用处是一样的!

定制的生活方式可以通过实施来创建ILifestyleManager。也许可以适当地实施这一点来创造一种ReallyTransient生活方式!

于 2008-09-25T12:39:38.830 回答