Как измерить утечки памяти в .NET надежным и автоматическим способом? - PullRequest
1 голос
/ 10 февраля 2009

Я написал автоматический тест, чтобы гарантировать, что наше приложение не утечет (управляемая и неуправляемая память) сейчас и позже по мере развития разработки. Проблема в том, что мой тест НЕ кажется надежным, но я не знаю, присущ ли он .NET и определению утечки, или тесту.

Это происходит так:

 long start = PrivateBytes;
 // here is the code for an action which is expected to be memory-constant
 long difference= PrivateBytes-start;
 Console.WriteLine(difference); // or Assert(difference < MyLimit);


private static long PrivateBytes
    {
        get
        {                
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            return Process.GetCurrentProcess().PrivateMemorySize64;
        }
    }

Мой вопрос: почему я получаю огромные различия в разнице? (пример: один прогон дает 11Mo, следующий 33 Mo). Являются ли эти изменения нормальными или я могу их удалить?

Точность: я НЕ ищу инструмент для профилирования! (Я уже использую один!)

Ответы [ 5 ]

3 голосов
/ 10 февраля 2009

Вы можете попробовать использовать внешний профилировщик, они созданы специально для вашей цели, чтобы найти утечки памяти и узкие места в приложениях. Полагаться на вызовы сборщика мусора и печатать значения не так точно, как реклама с использованием профилировщика. Для .NET есть много, вы можете искать их в Google. Просто процитировать некоторые:

от Microsoft официальный

другим

YourKit

MemProfiler

JetBrains

2 голосов
/ 10 февраля 2009

Используйте GC.GetTotalMemory () для получения приблизительного количества байтов, выделенных в данный момент в управляемой куче.

Для реального обнаружения утечек памяти предлагаю обратиться к специальному профилировщику.

2 голосов
/ 10 февраля 2009

PrivateBytes - это объем памяти процесса. Для управляемого кода вы выделяете место только в управляемой куче. Однако ОС ничего не знает об управляемой куче. Для Windows приложение .NET - это просто еще один процесс.

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

0 голосов
/ 10 февраля 2009

Я недавно нашел этот инструмент для ловли исключений, он бета и выиграл только в XP. Вы можете использовать, чтобы получить представление о том, как работает приложение. Прочтите инструкции в упаковке:

ExcpHook ver 0.0.5-rc2

и это:

Инструменты статического анализа для .NET, блог Мэтта Берсета

0 голосов
/ 10 февраля 2009

Вы обнаружите, что утечки памяти сами по себе есть только в вашем коде P / Invoke. «Новая» утечка памяти в .Net - это мертвые ссылки. Большинство проблем с памятью в .Net, которые кажутся утечками, на самом деле связаны с хранением ссылки на объект, который вы больше не используете, что означает, что он никогда не будет собирать мусор.

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

...