Лучшие методы в .NET: выявление утечек памяти приложения - Как происходит утечка памяти
ОГЛАВЛЕНИЕ
Как происходит утечка памяти?
После выяснения типа утечки памяти нужно разобраться, как происходит утечка памяти. Иными словами, что вызывает утечку памяти.
Введем утечку неуправляемой памяти, вызвав функцию ‘Marshal.AllocHGlobal’. Эта функция выделяет неуправляемую память и таким образом вводит утечку неуправляемой памяти в приложение. Эта команда выполняется в пределах таймера такое количество раз, чтобы вызвать огромную неуправляемую утечку.
private void timerUnManaged_Tick(object sender, EventArgs e)
{
Marshal.AllocHGlobal(7000);
}
Управляемую утечку ввести очень трудно, так как GC обеспечивает восстановление памяти. Для упрощения утечка управляемой памяти моделируется путем создания множества объектов кисти и добавления их в список, являющийся переменной уровня класса. Это имитация, а не управляемая утечка. После закрытия приложения эта память будет восстановлена.
private void timerManaged_Tick(object sender, EventArgs e)
{
for (int i = 0; i < 10000; i++)
{
Brush obj = new SolidBrush(Color.Blue);
objBrushes.Add(obj);
}
}
Если вам интересно узнать, как в управляемой памяти могут возникать утечки, можете обратиться к слабому обработчику за более подробной информацией http://msdn.microsoft.com/en-us/library/aa970850.aspx .
Следующий шаг – загрузка инструмента ‘debugdiag’ по адресу http://www.microsoft.com/DOWNLOADS/details.aspx?FamilyID=28bd5941-c458-46f1-b24d-f60151d875a3&displaylang=en
Запустите инструмент для диагностики при отладке и выберите ‘Утечка памяти и дескриптора’ нажмите следующее.
Выберите процесс, в котором вы хотите обнаружить утечку памяти.
В конце выберите ‘Активировать правило сейчас’.
Теперь оставьте приложение в работающем состоянии, и инструмент ‘Debugdiag’ будет выполняться во внутренней части, отслеживая выделение памяти.
После завершения нажмите на ‘начать анализ’ и позвольте инструменту выполнить анализ.
Вы должны получить подробный HTML отчет, показывающий, как была выделена неуправляемая память. В нашем коде была выделена огромная неуправляемая память при помощи ‘AllochGlobal’, что показано в отчете ниже.
Тип | Описание |
Предупреждение | mscorlib.ni.dll отвечает за выделение 3.59 Мбайт невыполненной памяти. Следующие 2 функции потребили больше всего памяти: |
Предупреждение | ntdll.dll отвечает за выделение 270.95 мегабайт невыполненной памяти. Следующие 2 функции потребили больше всего памяти: |
Утечка управляемой памяти кистей показана при помощи ‘GdiPlus.dll’ в следующем HTML отчете.
Тип | Описание |
Предупреждение | GdiPlus.dll отвечает за выделение 399.54 килобайт невыполненной памяти. |