为什么Castle Windsor会保留短暂对象?

31

最近我注意到我的应用程序似乎在使用永远不会释放的内存。在使用CLRProfiler进行分析后,我发现我正在使用的Castle Windsor容器一直持有对象。这些对象在配置XML中声明为lifestyle="transient"。

我发现如果我显式调用IWindsorContainer.Release(hangingObject),它会删除其引用。

然而,这会导致问题,我没有预料到使用瞬态生命周期对象的情况下,CastleWindsor会保留引用并创建一个内存泄漏。在所有适当的位置插入显式Release调用将是一个相当单调乏味且容易出错的任务。

您是否遇到过这个问题,并且您有任何建议可以解决它?

3个回答

22

我认为这里的答案缺少一个重要点——通过发布策略,这种行为可以直接配置 - 在castle项目网站上查看文档here

在许多情况下,特别是当您的容器存在于托管应用程序的整个生命周期中,并且短暂组件真的不需要被跟踪(因为您正在处理调用代码或已注入服务的组件中的处理方法),那么您只需将发布策略设置为NoTrackingReleasePolicy实现即可。

在Castle v 1.0之前,我相信会实现/引入组件负担 - 这也将帮助减轻与注入依赖项销毁等相关问题。

编辑:

请查看以下文章以获取有关组件负担的更多讨论。

The Component Burden - Davy Brions

此外,组件负担已经实现在Windsor容器的官方2.0版本中。


2

需要注意的是,这个问题似乎在Castle Trunk中已经得到了解决。在r5475中,Hammett将MicroKernel中的默认发布策略更改为LifecycledComponentsReleasePolicy


1

您可以在容器中的对象上设置单例或瞬态的生命周期。我理解单例对象应该持续整个应用程序的生命周期,但我不明白为什么瞬态对象的行为也要相同。

通过实现ILifestyleManager,可以创建自定义的生命周期。也许可以适当地实现它来创建一个ReallyTransient生命周期类型!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接