Как понять что в C# приложении есть утечка памяти? .NET


#1

Очень сложно мне обнаружить утечку памяти, вплоть до того момента когда уже не появляется ошибка OutOfMemoryException, но тут уже и индюку понятно что памяти не хватает...

Как можно заранее узнать что не хватает памяти или что она куда-то утекает?


#2

Ну, во первых, OutOfMemoryException возникает когда памяти уже не хватает и уже "поздно пить боржоми")

шучу.

Распознать утечку памяти можно когда отклик очень замедлен. Это происходит изза того что выполняется обмен с файлом подкачки, расположеным на диске.

Также постепенное увеличение объёма используемой памяти, которое видно в диспетчере задач - это также признак утечки памяти.

Если появляются подозрения, что в приложении есть утечка памяти, то нужно прежде всего определить тип памяти, в котором эта утечка имеет место. Это позволит определить область памяти, на которой нужно сосредоточить внимание и усилия при отладке.


#3

http://www.codenet.ru/progr/cpp/memleaks.php - вот здесь можно почитать про утечку памяти.

"При разработке больших приложений, оперирующих большими объемами информации на первое место при отладке встает проблема обнаружения неправильного распределения памяти. Суть проблемы состоит в том, что если мы выделили участок памяти, а затем освободили не весь выделенный объем, то образуются блоки памяти, которые помечены как занятые, но на самом деле они не используются. При длительной работе программы такие блоки могут накапливаться, приводя к значительному расходу памяти.

Как обнаружить утечку памяти..."


#4

Потенциальные утечки можно обранужить если запускать приложение с профайлером.

Например в Visual Studio есть меню Debug -> Performance Profiler и там можно выбрать Memory Usage, после чего запустится приложение, выполнив действия которые могу привести к утечке памяти делайте Snapshot и изучайте что где и в каких объемах создается и не освобождается.


#5

Спасибо!