我有一個緩存組成的每個元素包含兩個併發的字典,我認爲他們可能是我的應用程序中的內存泄漏負責。我經常從這本詞典中添加和刪除東西。有人能提供我描述內存分配如何適用於並行字典,以及在我的情況下最佳實踐是什麼?提前致謝!是否.Net 4.5.1 ConcurrentDictionary TryRemove()方法釋放分配的內存?
回答
任何.NET集合的remove方法都不會釋放內存,它只會從集合中刪除引用。如果沒有別的東西引用這些對象,垃圾收集器將最終清理它們。
引用的常見原因是忘記取消事件處理程序。
幾個.NET內存分析器,如MemProfiler,dotTrace和ANTS內存分析器都有試用版。
正如@Scott Chamberlain指出的,System.Runtime.Caching Namespace
包含的類型可讓您在.NET Framework應用程序中實現緩存。
'ConcurrentBag'實現並不總是在消耗它們後立即刪除引用:http://stackoverflow.com/questions/5353164/possible-memoryleak-in-concurrentbag – Gabe
哦,很好。 –
如果要移除的元素使用非託管內存(位圖等可想到),這些元素應該實現IDisposable
,並且應在最後一個引用超出範圍之前調用.Dispose
。
+1好點。如果他們正在大量使用它,我希望海報會提及非託管內存.... –
- 1. C#.NET 4.0 ConcurrentDictionary:鎖內的TryRemove?
- 2. ArrayList.clear()方法是否釋放內存?
- 3. 釋放分配的內存
- 4. 內存分配和釋放
- 5. 分配和釋放內存
- 6. 內存分配釋放
- 7. 內存分配和釋放內存
- 8. Ç - 內存分配和釋放內存
- 9. 是否刪除[]釋放指針分配的內存指針
- 10. 釋放使用malloc分配內存的最佳方法
- 11. 釋放alloca分配的內存
- 12. 從類方法中釋放分配的內存
- 13. ARC會釋放已在ViewdidLoad方法中分配的內存嗎?
- 14. 釋放動態分配的內存
- 15. 分配/釋放內存內循環
- 16. 誰負責釋放分配的內存?
- 17. 強制Windows釋放分配的內存
- 18. 如何釋放Swingworker分配的內存?
- 19. 靜態分配的內存釋放
- 20. 釋放分配有newCString的內存
- 21. 分配/釋放內存(Windows下的C++)
- 22. 分配最近釋放的內存
- 23. C - 釋放內存分配功能
- 24. 釋放由cudamallocpitch分配的內存
- 25. NSArray或NSMutableArray的removeAllObjects方法是否釋放內存?
- 26. 自動釋放內存分配
- 27. 釋放內存分配給Java中
- 28. 正確的釋放內存的方法
- 29. 關於釋放內存分配C
- 30. 在C++中分配和釋放內存
.NET中沒有任何類明確釋放分配的內存,除非它們是專門設計用來做這件事的專業類。它將釋放引用,但是取決於垃圾收集器爲對象取消分配內存。我會建議在你的程序上運行一個profiler,它可以跟蹤對象的生命週期和內存消耗,並找出你的韭菜的確切位置,而不是猜測它在哪裏。 –
另外如果你使用4.5.1 [有一些很好的新類到4.0](http://msdn.microsoft.com/en-us/library/system.runtime.caching%28v=vs.110%29。 aspx)用於構建對象的緩存。 –
謝謝,這就是我的意思,「GC將釋放被刪除的元素使用的內存」。因此,如果我有一個包含一定數量元素的併發字典,那麼我從它移除元素,然後在一段時間後,appication使用的總內存量會減少?應用程序使用大約45GB的內存,因此在這種情況下使用WinDbg很難。其他配置文件在應用程序開始使用〜4GB後停止工作。 –