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

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

Ниже перечислены шаги, которым нужно следовать, чтобы отслеживать индивидуальные байты в приложении при помощи счетчиков производительности:-

  • Запустите приложение, имеющее утечку памяти, и поддерживайте его в рабочем состоянии.
  • Щелкните мышкой по запуску Goto (идти к) и наберите на клавиатуре ‘perfmon’.
  • Удалите все имеющиеся счетчики производительности, выбирая счетчик и удаляя его путем нажатия на кнопку удаления.
  • Нажмите правую кнопку мыши, выберите ‘Add counters (добавить счетчики)’ , выберите ‘process (процесс)’ из объекта производительности.
  • Из списка счетчиков выберите ‘Private bytes (индивидуальные байты)’.
  • Из списка копий выберите приложение, которое вы хотите проверить на утечку памяти.

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

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

3-х шаговый процесс изучения утечки памяти

После подтверждения наличия утечки памяти нужно изучить основную проблему утечки памяти. Путь к решению делится на 3 этапа, отвечающих на вопросы: какой? как? и где?

  • Какой? -  Сначала нужно попытаться выяснить, каков тип утечки памяти – это управляемая утечка памяти или неуправляемая утечка памяти.
  • Как?  -  Что в действительности вызывает утечку памяти? Это объект соединения, файл какого-то типа, дескриптор которого не закрыт, и т.д.?
  • Где? -  Которая функция / процедура или логика вызывает утечку памяти?