Что такое частные байты, виртуальные байты, рабочий набор?

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

446
задан Jeffmagma 30 May 2017 в 04:34
поделиться

2 ответа

Короткий ответ на этот вопрос заключается в том, что ни одно из этих значений не является надежным индикатором того, сколько памяти на самом деле использует исполняемый файл, и ни одно из них не подходит для отладки утечки памяти.

Private Bytes относятся к объему памяти, который исполняемый процесс запросил - не обязательно к объему памяти, который он на самом деле использует . Они являются "приватными", потому что (обычно) исключают файлы, отображенные на карте памяти (т.е. общие DLL). Но - вот в чем подвох - они не обязательно исключают память , выделенную этими файлами . Невозможно сказать, было ли изменение приватных байт связано с самим исполняемым файлом, или с подключенной библиотекой. Приватные байты также являются не исключительно физической памятью; они могут быть выведены на диск или в список резервных страниц (т.е. больше не используются, но и не выведены).

Рабочий набор относится к общей физической памяти (ОЗУ), используемой процессом. Однако, в отличие от приватных байтов, сюда также входят файлы с отображением памяти и различные другие ресурсы, поэтому это еще менее точное измерение, чем приватные байты. Это то же самое значение, которое сообщается в "Использовании памяти" диспетчера задач и является источником бесконечного количества путаницы в последние годы. Память в рабочем наборе является "физической" в том смысле, что она может быть адресована без ошибок страницы; однако, список резервных страниц также всё ещё физически находится в памяти, но не сообщается в рабочем наборе, и поэтому при сворачивании приложения вы можете увидеть, что "Использование памяти" внезапно падает.

Виртуальные байты - это общее виртуальное адресное пространство , занимаемое всем процессом. Это похоже на рабочий набор, в том смысле, что он включает в себя файлы, отображенные на карте памяти (общие DLL), а также данные в резервном списке и данные, которые уже были выведены на страницу и находятся где-то на диске в pagefile. Общее количество виртуальных байт, используемое каждым процессом в системе под большой нагрузкой, добавит значительно больше памяти, чем у машины на самом деле.

Итак, отношениями являются:

  • Приватные байты - это то, что реально выделено вашим приложением, но включает использование файла страницы;
  • Рабочий набор - это нестраничные приватные байты плюс файлы, отображенные на карте памяти;
  • Виртуальные байты - это рабочий набор плюс страничные приватные байты и список ожидания.

Есть еще одна проблема: так же как общие библиотеки могут выделять память внутри модуля вашего приложения, что приводит к потенциальным ложным срабатываниям, сообщаемым в Private Bytes вашего приложения, ваше приложение может также выделять память внутри модулей shared, что приводит к ложным срабатываниям negatives. Это означает, что на самом деле у вашего приложения может произойти утечка памяти, которая вообще никогда не проявляется в Private Bytes. Вряд ли, но возможно.

Private Bytes - это разумное приближение объема памяти, используемого Вашим исполняемым приложением, и может быть использовано для того, чтобы сузить список потенциальных кандидатов на утечку памяти; если Вы видите, что число постоянно и бесконечно растет, то Вы захотите проверить этот процесс на наличие утечки. Однако не может доказать наличие или отсутствие утечки.

Одним из наиболее эффективных инструментов для обнаружения/устранения утечек памяти в Windows на самом деле является Visual Studio (ссылка идет на страницу использования VS для устранения утечки памяти, а не на страницу продукта). Другая возможность - Rational Purify Rational Purify. В Microsoft также есть более общий документ о лучших практиках на эту тему. В этом предыдущем вопросе перечислено больше инструментов.

Надеюсь, это прояснит некоторые вещи! Отслеживание утечек памяти - одна из самых сложных вещей при отладке. Удачи.

486
ответ дан 22 November 2019 в 22:57
поделиться

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

Предыдущий ответ на этот вопрос дал прекрасное объяснение того, что это за типы.

Вы спрашиваете о рекомендации по использованию инструмента: Я рекомендую Memory Validator. Возможность мониторинга приложений, которые выделяют миллиарды памяти.

http://www.softwareverify.com/cpp/memory/index.html

Заявление об ограничении ответственности: я разработал средство проверки памяти.

10
ответ дан 22 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: