Лучшие методы в .NET: выявление утечек памяти приложения - Типы утечки памяти

ОГЛАВЛЕНИЕ

Каков тип утечки памяти?

Перед тем, как пытаться понять, какой тип имеет утечка, попытаемся понять, как выделяется память в приложениях .Net. Приложение .NET имеет два типа памяти - управляемая память и неуправляемая память. Управляемая память контролируется сборкой мусора, в то время как неуправляемая память находится за пределами границ сборщиков мусора.

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

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

Второй счетчик, который нужно добавить, - это ‘Байты во всех кучах’. Выберите ‘память .NET CLR’ в объекте производительности, из списка счетчиков выберите ‘Байты во всех кучах’ и выберите приложение, имеющее утечку памяти.

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

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

Ниже даны два утверждения:

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

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

Ниже показан типовой скриншот управляемой утечки. Байты во всех кучах увеличиваются.