Краткий ответ на этот вопрос заключается в том, что ни одно из этих значений не является надежным индикатором того, сколько памяти фактически использует исполняемый файл, и ни одно из них не подходит для устранения утечки памяти.
Частные байты относятся к объему памяти, запрошенному исполняемым файлом процесса - не обязательно к объему, который он фактически использует . Они являются «частными», потому что они (обычно) исключают файлы, отображаемые в памяти (то есть разделяемые библиотеки DLL). Но - вот в чем загвоздка - они не обязательно исключают память, выделенную этими файлами . Невозможно определить, произошло ли изменение в частных байтах из-за самого исполняемого файла или из-за связанной библиотеки. Частные байты также не являются исключительно физической памятью; они могут быть перенесены на диск или в список резервных страниц (т.е. больше не используются, но еще не выгружены).
Рабочий набор относится к общей физической памяти (ОЗУ), используемой процессом. Однако, в отличие от частных байтов, это также включает в себя отображенные в память файлы и различные другие ресурсы, поэтому это даже менее точное измерение, чем частные байты. Это то же значение, о котором сообщается в «Использование памяти» диспетчера задач, и в последние годы оно вызывает бесконечную путаницу. Память в рабочем наборе является «физической» в том смысле, что к ней можно обращаться без ошибок страницы; однако, список резервных страниц также все еще физически находится в памяти, но не отображается в рабочем наборе, и поэтому вы можете внезапно сбросить «Использование памяти» при сворачивании приложения.
Виртуальные байты - это общее виртуальное адресное пространство, занимаемое всем процессом. Это похоже на рабочий набор, в том смысле, что он включает в себя отображенные в память файлы (общие библиотеки DLL), но он также включает в себя данные в резервном списке и данные, которые уже были выгружены и находятся где-то в файле подкачки на диске. Общее количество виртуальных байтов, используемых каждым процессом в системе под большой нагрузкой, значительно увеличит объем памяти, чем машина имеет на самом деле.
Итак, отношения:
- Частные байты - это то, что ваше приложение фактически выделило, но включает использование файла подкачки;
- Рабочий набор - это не страничные частные байты плюс отображенные в памяти файлы;
- Виртуальные байты - это рабочий набор, постраничные приватные байты и резервный список.
Здесь есть другая проблема; Точно так же, как разделяемые библиотеки могут выделять память внутри модуля приложения, что приводит к потенциальным ложным срабатываниям, сообщаемым в личных байтах вашего приложения , так и ваше приложение может в конечном итоге выделять память внутри общих модулей, что приводит к ложным отрицаниям . Это означает, что на самом деле ваше приложение может иметь утечку памяти, которая вообще никогда не проявляется в приватных байтах. Вряд ли, но возможно.
Частные байты являются разумным приближением к объему памяти, используемому вашим исполняемым файлом, и могут использоваться, чтобы помочь сузить список потенциальных кандидатов на утечку памяти; если вы видите, что число постоянно растет и бесконечно растет, вам следует проверить этот процесс на наличие утечек. Это, однако, не может доказать, что есть или нет утечка.
Одним из наиболее эффективных инструментов для обнаружения / исправления утечек памяти в Windows на самом деле является Visual Studio (ссылка ведет на страницу об использовании VS для утечек памяти, а не на страницу продукта). Rational Purify - это еще одна возможность. У Microsoft также есть более общий документ с рекомендациями по этому вопросу. В этом предыдущем вопросе перечислены другие инструменты .
Я надеюсь, что это проясняет некоторые вещи! Отслеживание утечек памяти - одна из самых сложных вещей при отладке. Удачи.