最近我注意到我的应用程序似乎正在吃掉永不释放的内存。在使用CLRProfiler进行分析后,我发现我使用的Castle Windsor容器正在抓住物体。这些对象在config xml中使用lifestyle =“transient”属性声明。
我发现如果我明确调用IWindsorContainer.Release(hangingObject)
,它会删除它的引用。
这引起了一个问题,我没想到,对于一个短暂的生活方式对象,CastleWindsor会保留一个引用并有效地创建泄漏。这将是一个相当普通且容易出错的任务,在所有适当的地方插入显式的Release调用。
你有没有看到这个问题,你有什么建议可以解决这个问题吗?
答案 0 :(得分:20)
我认为这里的答案缺少一个重要的观点 - 这种行为可以通过发布政策开箱即用 - 查看城堡项目网站here上的文档。
在许多情况下,特别是在托管应用程序的生命周期内容器存在的情况下,以及实际上不需要跟踪瞬态组件的情况(因为您正在处理调用代码或已注入服务的组件中的处理)然后你可以将发布策略设置为NoTrackingReleasePolicy
实现并完成它。
在Castle v 1.0之前,我相信Component Burden将被实现/引入 - 这将有助于缓解一些这些问题以及处理注入的依赖项等。
修改强>
有关组件负担的更多讨论,请查看以下帖子。
The Component Burden - Davy Brions
此外,组件负担也在Windsor Container的official 2.0 release中实施。
答案 1 :(得分:2)
有一点需要注意的是,这似乎已在Castle Trunk中得到修复。在r5475中,Hammett将MicroKernel中的默认发布策略更改为LifecycledComponentsReleasePolicy
。
答案 2 :(得分:1)
您可以在容器中的对象上设置单身或瞬态的生活方式。我理解的Singleton对象应该持续应用程序的生命周期,但我不明白这个behvaviour对于瞬态对象的用处是否相同!
可以通过实施ILifestyleManager
来创建自定义生活方式。也许有可能适当地实现这个以创建ReallyTransient
生活方式类型!