Коротка відповідь на це запитання полягає в тому, що жодне з цих значень не є надійним показником того, скільки пам’яті фактично використовується виконуваний файл, і жодне з них насправді не підходить для налагодження витоку пам’яті.
Байт відносяться до кількості пам'яті , що процес виконуваним вже просив - не обов'язково сума його фактичного використання . Вони є "приватними", оскільки вони (як правило) виключають файли, відображені в пам'яті (тобто спільні DLL-файли). Але ось ось у чому суть - вони не обов'язково виключають пам'ять, виділену цими файлами . Неможливо сказати, чи була зміна приватних байтів саме через виконуваний файл або через пов'язану бібліотеку. Приватні байти також не є виключно фізичною пам'яттю; вони можуть бути підключені до диску або до списку сторінок у режимі очікування (тобто більше не використовуються, але ще не є підказками).
Робочий набір позначає загальну фізичну пам'ять (ОЗП), яку використовує процес. Однак, на відміну від приватних байтів, сюди також входять файли з картографічною пам'яттю та різні інші ресурси, тому це навіть менш точне вимірювання, ніж приватні байти. Це те саме значення, про яке повідомляється в "Mem Використання" диспетчера завдань і є джерелом нескінченної сум'яття в останні роки. Пам'ять у Робочому наборі "фізична" в тому сенсі, що до неї можна звертатись без помилок сторінки; однак, список сторінок у режимі очікування також все ще фізично зберігається в пам’яті, але не повідомляється в Робочому наборі, і саме тому ви можете побачити, як «Використання пам’яті» раптом падає, коли ви мінімізуєте програму.
Віртуальні байти - це загальний віртуальний адресний простір, зайнятий усім процесом. Це схоже на робочий набір, в тому сенсі, що він включає в себе файли з картографічною пам'яттю (спільні DLL-файли), але він також включає дані в списку очікування та дані, які вже були викладені на сторінку, і десь сидять у файлі сторінок на диску. Загальна кількість віртуальних байтів, використовуваних кожним процесом у системі під великим навантаженням, збільшить значно більше пам’яті, ніж на машині насправді.
Отже відносини такі:
- Приватні байти - це те, що ваша програма фактично виділила, але включає використання файлів сторінки;
- Робочий набір - це нерозпізнані приватні байти плюс файли з картою пам'яті;
- Віртуальні байти - це робочий набір плюс підписані приватні байти та список очікування.
Тут є ще одна проблема; подібно до того, як спільні бібліотеки можуть виділяти пам'ять у вашому модулі додатків, що призводить до потенційних помилкових позитивів, повідомлених у приватних байтах вашої програми , так само ваше додаток може виділити пам'ять всередині загальних модулів, що призводить до помилкових негативів . Це означає, що у вашій програмі фактично можливо витік пам’яті, який ніколи не виявляється у приватних байтах. Навряд чи, але можливо.
Приватні байти - це розумне наближення обсягу пам’яті, яку використовує ваш виконуваний файл, і його можна використовувати для звуження списку потенційних кандидатів на витік пам’яті; якщо ви бачите, що кількість постійно зростає та зростає, ви хочете перевірити цей процес на течію. Однак це не може довести, що витік є чи немає.
Один з найефективніших інструментів виявлення / виправлення витоків пам'яті в Windows - це насправді Visual Studio (посилання переходить на сторінку про використання VS для витоку пам'яті, а не на сторінці продукту). Раціональне очищення - це ще одна можливість. Microsoft також має більш загальний документ з найкращих практик з цього приводу. У цьому попередньому запитанні є більше інструментів .
Я сподіваюся, що це очистить кілька речей! Відстеження витоків пам’яті - одна з найскладніших речей, що потрібно зробити при налагодженні. Удачі.