2008-09-25 32 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