2012-10-17 41 views
3

可能重複:
Weak references什麼時候在C#中使用WeakReference(如果不是用於緩存)?

這個東西是什麼呢?

它似乎是一種創建GC可以儘早收集的對象的方法,如果它早期收集,我應該重新創建它。這聽起來像我緩存,但其他StackOverflow questions say that this is a lousy cache strategy because the GC in practice will GC your object very eager and fast,(another Q that says weakreference make poor caches)有點像使用ASP.NET的緩存並將其設置爲非常低的緩存逐出時間限制。

背景:我最近正在閱讀TraceSource的CLR代碼。在構造函數中,發生的第一件事是將WeakReference(this)添加到靜態字典中。奇怪的是,只有在TraceSource重新讀取弱引用字典中的每個TraceSource的配置文件時,纔會在Refresh方法中使用它,但前提是它尚未被GC化。而另一個StackOverflow question indicates this causes memory leaks

所以我一直在閱讀關於WeakReferences並越來越困惑。

+0

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references – DarthVader

+2

@DarthVader我不確定JVM行爲是否指示CLR行爲。 – MatthewMartin

回答

4

WeakReference通常用於實現Weak Events。事件處理程序是內存泄漏的常見原因,特別是當您擁有多個實例訂閱的事件的長期服務時。如果這些實例無法註銷它們的事件處理程序(或者是因爲開發人員沒有意識到它很重要,或者通常是由於異常情況沒有觸發正常清理),那麼延遲引用會阻止收集實例。

另一個很好的情況是,如果您想要將其他數據與現有實例相關聯。例如,您可能需要一個您想要與第三方Widget關聯的ExtraWidgetInfo。創建關聯的一種方法是使用字典。問題是,現在所有的Widget都被Dictionary保存,即使它們不再在其他地方使用。對Widget引用使用WeakReference可以使相關數據保持Widget超過其預期到期。

3

緩存就是一個很好的例子。如果您在緩存中使用弱引用,那麼未請求的項目可以被垃圾回收以回收內存。

簡而言之:任何方便檢索的東西,但不關鍵的,如果你不這樣做。

1

肯定不適合緩存,因爲GC會在運行時清理所有當前未引用的緩存項。它不會等待內存壓力或什麼。它不允許緩存增長。

相關問題