2013-12-11 2 views
1

У меня есть кэш, состоящий из элементов, каждый из которых содержит два параллельных словаря, и я думаю, что они могут нести ответственность за утечку памяти в моем приложении. Я часто добавляю и удаляю материал из этого словаря. Может ли кто-нибудь дать мне описание того, как распределение памяти работает для параллельного словаря и какова наилучшая практика в моем случае? Заранее спасибо!Использует ли .Net 4.5.1 ConcurrentDictionary? Метод TryRemove() освобождает выделенную память?

+1

Ни один из классов в .NET явно не выделяет выделенную память, если только они не являются специальным классом, предназначенным для этого. Он выпустит ссылки, но сборщик мусора может отказаться от выделения памяти для объекта. Я бы рекомендовал запустить профилировщик в вашей программе, который может отслеживать время жизни объектов и потребление памяти и выяснить, где ваш лук-порей действительно, а не гадать, где он находится. –

+0

Также, если вы используете 4.5.1 [есть несколько хороших новых классов до 4.0] (http://msdn.microsoft.com/en-us/library/system.runtime.caching%28v=vs.110%29. aspx) для построения кешей объектов. –

+0

Спасибо, вот что я на самом деле имел в виду: «Будет ли релиз памяти GC, который использовался удаленным элементом». Итак, если у меня есть параллельный словарь с некоторым количеством элементов, то я удаляю элемент из него, а затем через некоторое время общее количество памяти, используемой приложением, уменьшится? В приложении используется около 45 ГБ памяти, поэтому в этом случае сложно использовать WinDbg. Другие профили перестают работать после того, как приложение начнет использовать ~ 4 ГБ. –

ответ

4

Любой метод удаления .NET collection не освобождает память, он просто удалит ссылку из коллекции. Если ничто иное не ссылается на эти объекты, сборщик мусора в конечном итоге очистит их.

Общепринятая причина ссылок заключается в том, чтобы забыть о нежелательных обработчиках событий.

Несколько профайлов .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 Хорошая точка. Я бы надеялся, что на плакате будет упоминаться неуправляемая память, если они будут использовать ее ... –

 Смежные вопросы

  • Нет связанных вопросов^_^