2008-09-25 35 views
29

最近我发现我的应用程序似乎是吃,从来没有得到释放内存。在使用CLRProfiler进行分析后,我发现我正在使用的Castle Windsor容器正在保存对象。这些对象在config xml中使用lifestyle =“transient”属性声明。为什么温莎城堡保持暂时的物体?

我发现,如果我把一个显式调用IWindsorContainer.Release(hangingObject),它将放弃其引用。

这虽然造成了问题,我没想到的是一个短暂的生活方式对象CastleWindsor将保持一个参考,并有效地创建一个泄漏。这将是一个相当普通且容易出错的任务,会在所有适当的位置插入显式的Release调用。

你见过这个问题,你对如何解决它有什么建议?

回答

20

我认为这里的答案是缺少一种关键的一点 - 这种行为通过发布政策是可配置的开箱 - 查看城堡项目现场here的文档。

在很多情况下,特别是当您的容器存在于宿主应用程序的整个生命周期中,并且瞬态组件真的不需要跟踪(因为您正在处理调用代码或已注入服务),那么你可以只设置释放政策的实施NoTrackingReleasePolicy并用它做。

此前城堡1.0版,我相信组件负担将实行/出台 - 这将有助于缓解这些问题,以及围绕依赖注入等的处置

编辑:

退房以下帖子可以更多地讨论组件负担。

The Component Burden - Davy Brions

另外组分负担在温莎容器的official 2.0 release实现。

1

您可以设置单或短暂的生活方式,虽然在容器对象。单一对象我的理解应该持续应用的生活,但我不明白这behvaviour的用处是瞬态的人一样!

自定义的生活方式可以通过实现ILifestyleManager创建。也许这是可以实现这个适当创建ReallyTransient生活方式的类型!

2

有一点需要注意的是,这似乎已经固定在城堡干线。在r5475,哈米特改变了微内核默认发布政策LifecycledComponentsReleasePolicy