2013-12-11 93 views
1

我有一個緩存組成的每個元素包含兩個併發的字典,我認爲他們可能是我的應用程序中的內存泄漏負責。我經常從這本詞典中添加和刪除東西。有人能提供我描述內存分配如何適用於並行字典,以及在我的情況下最佳實踐是什麼?提前致謝!是否.Net 4.5.1 ConcurrentDictionary TryRemove()方法釋放分配的內存?

+1

.NET中沒有任何類明確釋放分配的內存,除非它們是專門設計用來做這件事的專業類。它將釋放引用,但是取決於垃圾收集器爲對象取消分配內存。我會建議在你的程序上運行一個profiler,它可以跟蹤對象的生命週期和內存消耗,並找出你的韭菜的確切位置,而不是猜測它在哪裏。 –

+0

另外如果你使用4.5.1 [有一些很好的新類到4.0](http://msdn.microsoft.com/en-us/library/system.runtime.caching%28v=vs.110%29。 aspx)用於構建對象的緩存。 –

+0

謝謝,這就是我的意思,「GC將釋放被刪除的元素使用的內存」。因此,如果我有一個包含一定數量元素的併發字典,那麼我從它移除元素,然後在一段時間後,appication使用的總內存量會減少?應用程序使用大約45GB的內存,因此在這種情況下使用WinDbg很難。其他配置文件在應用程序開始使用〜4GB後停止工作。 –

回答

4

任何.NET集合的remove方法都不會釋放內存,它只會從集合中刪除引用。如果沒有別的東西引用這些對象,垃圾收集器將最終清理它們。

引用的常見原因是忘記取消事件處理程序。

幾個.NET內存分析器,如MemProfiler,dotTrace和ANTS內存分析器都有試用版。

正如@Scott Chamberlain指出的,System.Runtime.Caching Namespace包含的類型可讓您在.NET Framework應用程序中實現緩存。

+0

'ConcurrentBag'實現並不總是在消耗它們後立即刪除引用:http://stackoverflow.com/questions/5353164/possible-memoryleak-in-concurrentbag – Gabe

+0

哦,很好。 –

3

如果要移除的元素使用非託管內存(位圖等可想到),這些元素應該實現IDisposable,並且應在最後一個引用超出範圍之前調用.Dispose

+0

+1好點。如果他們正在大量使用它,我希望海報會提及非託管內存.... –