У меня есть кэш, состоящий из элементов, каждый из которых содержит два параллельных словаря, и я думаю, что они могут нести ответственность за утечку памяти в моем приложении. Я часто добавляю и удаляю материал из этого словаря. Может ли кто-нибудь дать мне описание того, как распределение памяти работает для параллельного словаря и какова наилучшая практика в моем случае? Заранее спасибо!Использует ли .Net 4.5.1 ConcurrentDictionary? Метод TryRemove() освобождает выделенную память?
ответ
Любой метод удаления .NET collection не освобождает память, он просто удалит ссылку из коллекции. Если ничто иное не ссылается на эти объекты, сборщик мусора в конечном итоге очистит их.
Общепринятая причина ссылок заключается в том, чтобы забыть о нежелательных обработчиках событий.
Несколько профайлов .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. Использует ли «удаление», как это освобождает исходную выделенную память?
- 2. C# .NET 4.0 ConcurrentDictionary: TryRemove внутри блокировки?
- 3. Когда ConcurrentDictionary TryRemove возвращает false
- 4. Метод ArrayList.clear() освобождает память?
- 5. ли C автоматически освобождает выделенную память внутри функции?
- 6. Соединил ли() освобождает выделенную память? - C++ 11 Темы
- 7. Почему Jetty не использует всю выделенную память?
- 8. ARC не освобождает память, выделенную для частных переменных
- 9. TryRemove пара ключ-значение из ConcurrentDictionary в C#
- 10. Вектор clear(), похоже, не освобождает память, выделенную в push_back
- 11. json_decref не освобождает память?
- 12. Освобождает ли указатель бесплатно память?
- 13. Почему метод ArrayList.clear() не освобождает память?
- 14. PipelineBuffer не освобождает память
- 15. Ссылка на DLL .NET 3.5 из приложения .NET 4.5.1 (EXE) использует объекты .NET 4.5.1
- 16. Как освободить память, выделенную Swingworker?
- 17. addSubview не освобождает память
- 18. Можно ли освободить выделенную память из C++
- 19. словарь не освобождает память
- 20. В C можно ли уменьшить выделенную память, не перемещая ее?
- 21. Android - получить выделенную память
- 22. Освободите память, выделенную DeviceIoControl
- 23. C# очищает C++ выделенную память?
- 24. OpenCV освобождает память?
- 25. Невозможно освободить выделенную память
- 26. AVAudioPlayer не освобождает память
- 27. Свободно освобождает память
- 28. Когда ctypes освобождает память?
- 29. JBoss не освобождает память
- 30. HP Loadrunner - web_reg_save_param_ex освобождает память?
Ни один из классов в .NET явно не выделяет выделенную память, если только они не являются специальным классом, предназначенным для этого. Он выпустит ссылки, но сборщик мусора может отказаться от выделения памяти для объекта. Я бы рекомендовал запустить профилировщик в вашей программе, который может отслеживать время жизни объектов и потребление памяти и выяснить, где ваш лук-порей действительно, а не гадать, где он находится. –
Также, если вы используете 4.5.1 [есть несколько хороших новых классов до 4.0] (http://msdn.microsoft.com/en-us/library/system.runtime.caching%28v=vs.110%29. aspx) для построения кешей объектов. –
Спасибо, вот что я на самом деле имел в виду: «Будет ли релиз памяти GC, который использовался удаленным элементом». Итак, если у меня есть параллельный словарь с некоторым количеством элементов, то я удаляю элемент из него, а затем через некоторое время общее количество памяти, используемой приложением, уменьшится? В приложении используется около 45 ГБ памяти, поэтому в этом случае сложно использовать WinDbg. Другие профили перестают работать после того, как приложение начнет использовать ~ 4 ГБ. –