Что такое частные байты, виртуальные байты, рабочий набор?
Я пытаюсь использовать утилиту perfmon для отладки утечек памяти в процессе.
Вот как perfmon объясняет термины:
Рабочий набор — это текущий размер в байтах рабочего набора этого процесса. Рабочий набор — это набор страниц памяти, недавно затронутых потоками в процессе. Если объем свободной памяти в компьютере превышает пороговое значение, страницы остаются в рабочем наборе процесса, даже если они не используются. Когда объем свободной памяти падает ниже порогового значения, страницы обрезаются из рабочих наборов. Если они необходимы, они затем будут мягко сбиты обратно в рабочий набор перед тем, как покинуть основную память.
Виртуальные байты — это текущий размер в байтах виртуального адресного пространства, которое использует процесс. Использование виртуального адресного пространства не обязательно подразумевает соответствующее использование страниц диска или основной памяти. Виртуальное пространство конечно, и процесс может ограничивать его способность загружать библиотеки.
Частные байты — это текущий объем памяти в байтах, выделенный этим процессом, который нельзя использовать совместно с другими процессами.
Вот вопросы, которые у меня есть:
Это частные байты, которые я должен измерить, чтобы быть уверенным в том, что у процесса есть какие-либо утечки, поскольку он не включает какие-либо общие библиотеки, и любые утечки, если они произойдут, будут происходить из самого процесса?
Какова общая память, используемая процессом? Это виртуальные байты или сумма виртуальных байтов и рабочего набора?
Есть ли какая-либо связь между частными байтами, рабочим набором и виртуальными байтами?
Есть ли другие инструменты, которые дают лучшее представление об использовании памяти?
Краткий ответ на этот вопрос заключается в том, что ни одно из этих значений не является надежным индикатором того, сколько памяти фактически использует исполняемый файл, и ни одно из них не подходит для устранения утечки памяти.
Частные байты относятся к объему памяти, запрошенному исполняемым файлом процесса — не обязательно к объему, который он фактически использует . Они являются «частными», потому что они (обычно) исключают файлы, отображаемые в памяти (то есть разделяемые библиотеки DLL). Но — вот в чем загвоздка — они не обязательно исключают память, выделенную этими файлами . Невозможно определить, произошло ли изменение в частных байтах из-за самого исполняемого файла или из-за связанной библиотеки. Частные байты также не являются исключительно физической памятью; они могут быть перенесены на диск или в список резервных страниц (т.е. больше не используются, но еще не выгружены).
Рабочий набор относится к общей физической памяти (ОЗУ), используемой процессом. Однако, в отличие от частных байтов, это также включает в себя отображенные в память файлы и различные другие ресурсы, поэтому это даже менее точное измерение, чем частные байты. Это то же значение, о котором сообщается в «Использование памяти» диспетчера задач, и в последние годы оно вызывает бесконечную путаницу. Память в рабочем наборе является «физической» в том смысле, что к ней можно обращаться без ошибок страницы; однако, список резервных страниц также все еще физически находится в памяти, но не отображается в рабочем наборе, и поэтому вы можете внезапно сбросить «Использование памяти» при сворачивании приложения.
Виртуальные байты — это общее виртуальное адресное пространство, занимаемое всем процессом. Это похоже на рабочий набор, в том смысле, что он включает в себя отображенные в память файлы (общие библиотеки DLL), но он также включает в себя данные в резервном списке и данные, которые уже были выгружены и находятся где-то в файле подкачки на диске. Общее количество виртуальных байтов, используемых каждым процессом в системе под большой нагрузкой, значительно увеличит объем памяти, чем машина имеет на самом деле.
- Частные байты — это то, что ваше приложение фактически выделило, но включает использование файла подкачки;
- Рабочий набор — это не страничные частные байты плюс отображенные в памяти файлы;
- Виртуальные байты — это рабочий набор, постраничные приватные байты и резервный список.
Здесь есть другая проблема; Точно так же, как разделяемые библиотеки могут выделять память внутри модуля приложения, что приводит к потенциальным ложным срабатываниям, сообщаемым в личных байтах вашего приложения , так и ваше приложение может в конечном итоге выделять память внутри общих модулей, что приводит к ложным отрицаниям . Это означает, что на самом деле ваше приложение может иметь утечку памяти, которая вообще никогда не проявляется в приватных байтах. Вряд ли, но возможно.
Частные байты являются разумным приближением к объему памяти, используемому вашим исполняемым файлом, и могут использоваться, чтобы помочь сузить список потенциальных кандидатов на утечку памяти; если вы видите, что число постоянно растет и бесконечно растет, вам следует проверить этот процесс на наличие утечек. Это, однако, не может доказать, что есть или нет утечка.
Одним из наиболее эффективных инструментов для обнаружения / исправления утечек памяти в Windows на самом деле является Visual Studio (ссылка ведет на страницу об использовании VS для утечек памяти, а не на страницу продукта). Rational Purify — это еще одна возможность. У Microsoft также есть более общий документ с рекомендациями по этому вопросу. В этом предыдущем вопросе перечислены другие инструменты .
Я надеюсь, что это проясняет некоторые вещи! Отслеживание утечек памяти — одна из самых сложных вещей при отладке. Удачи.
Sysadminium
Изучая память процессов в системе Windows вы обязательно столкнётесь с таким понятием как рабочий набор процесса. В этой статье разберём что это такое.
Рабочий набор
Рабочий набор – это виртуальные страницы памяти в которых процесс хранит необходимые ему данные.
Если объем свободной памяти компьютера превышает пороговое значение, страницы остаются в рабочем наборе даже если они не используются.
А если свободная память (free) окажется ниже порогового значения, то страницы изымаются из рабочих наборов. Такие страницы могут быть помещены с кэш. То есть они все равно останутся в оперативной памяти. При обращении к таким страницам, процесс получит ошибку page fault и страница вернется из кэша.
Если возрастет нагрузка на оперативную память, то данные могут быть выгружены в файл подкачки. При этом возврат данных из подкачки займет большее времени чем возврат страниц из кэша.
Наблюдение за рабочим набором процесса
Наблюдать за рабочим набором процесса будем с помощью “Системного монитора“.
- Находим оснастку “Системный монитор“:
- Удаляем счетчик производительности, который был по умолчанию:
- И добавляем новый счетчик производительности:
- Находим группу счетчиков “Процесс“, в ней находим процесс (я посмотрю за процессом Chrome).
- Выбираем счетчики: “Ошибок страниц/с“, “Рабочий набор” и его пик.
- Нажимаем кнопку “Добавить” и “OK“
- Переключаем внешний вид на «Отчет».
- Смотрим данные:
- Рабочий набор — это объем страниц в памяти для данного процесса в байтах.
- Рабочий набор (пик) — это максимальный объем страниц, который был в памяти для данного процесса за все время работы процесса.
- Ошибок страницы/с — это частота ошибок, когда поток не находит нужную страницу в памяти и её необходимо подгружать.
Сумма рабочих процессов не равна используемой памяти
Суммарный объем всех рабочих наборов процессов не равен всей используемой оперативной памяти. Если помните, в системе присутствует общая память. Страницы от туда могут быть замаплены к разным процессам. Про это было написано тут. А каждый процесс думает что эта страница относится к его рабочему набору. Другими словами, одна общая страница будет считаться несколько раз для каждого процесса.
Что такое частные байты, виртуальные байты, рабочий набор?
Я пытаюсь использовать служебную программу Windows perfmon для отладки утечек памяти в процессе.
Вот как perfmon объясняет термины:
Рабочий набор — это текущий размер в байтах рабочего набора этого процесса. Рабочий набор — это набор страниц памяти, недавно затронутых потоками в процессе. Если объем свободной памяти в компьютере превышает пороговое значение, страницы остаются в рабочем наборе процесса, даже если они не используются. Когда объем свободной памяти становится ниже порогового значения, страницы удаляются из рабочих наборов. Если они необходимы, они будут возвращены в рабочий набор перед тем, как покинуть основную память.
Виртуальные байты — это текущий размер в байтах виртуального адресного пространства, которое использует процесс. Использование виртуального адресного пространства не обязательно подразумевает соответствующее использование страниц диска или основной памяти. Виртуальное пространство ограничено, и процесс может ограничивать его способность загружать библиотеки.
Частные байты — это текущий размер в байтах памяти, выделенной этим процессом, которую нельзя использовать совместно с другими процессами.
Вот вопросы, которые у меня есть:
Это частные байты, которые я должен измерить, чтобы убедиться, есть ли в процессе какие-либо утечки, поскольку он не связан с какими-либо разделяемыми библиотеками, и любые утечки, если они происходят, будут исходить от самого процесса?
Какая общая память потребляется процессом? Это виртуальные байты или сумма виртуальных байтов и рабочего набора?
Есть ли связь между частными байтами, рабочим набором и виртуальными байтами?
Есть ли какие-нибудь другие инструменты, которые дают лучшее представление об использовании памяти?
Короткий ответ на этот вопрос заключается в том, что ни одно из этих значений не является надежным индикатором того, сколько памяти фактически использует исполняемый файл, и ни одно из них не подходит для отладки утечки памяти.
Частные байты относятся к объему памяти, который запрашивает исполняемый файл процесса — не обязательно к объему, который он фактически использует . Они «частные», потому что (обычно) исключают файлы с отображением в память (т. Е. Разделяемые библиотеки DLL). Но — вот загвоздка — они не обязательно исключают память, выделенную этими файлами . Невозможно определить, произошло ли изменение в частных байтах из-за самого исполняемого файла или из-за связанной библиотеки. Частные байты также не являются исключительно физической памятью; они могут быть выгружены на диск или в список резервных страниц (т. е. больше не используются, но и не выгружены).
Рабочий набор относится к общей физической памяти (ОЗУ), используемой процессом. Однако, в отличие от частных байтов, сюда также входят файлы с отображением в память и различные другие ресурсы, поэтому это даже менее точное измерение, чем частные байты. Это то же значение, которое сообщается в диспетчере задач «Использование памяти» и в последние годы является источником бесконечной путаницы. Память в рабочем наборе является «физической» в том смысле, что к ней можно обращаться без сбоя страницы; однако список страниц ожидания также физически находится в памяти, но не отображается в рабочем наборе, и поэтому вы можете увидеть, что «Использование памяти» внезапно пропадает, когда вы сворачиваете приложение.
Виртуальные байты — это общее виртуальное адресное пространство, занятое всем процессом. Это похоже на рабочий набор в том смысле, что он включает файлы с отображением памяти (общие библиотеки DLL), но он также включает данные в резервном списке и данные, которые уже были выгружены и находятся где-то в файле подкачки на диске. Общее количество виртуальных байтов, используемых каждым процессом в системе при большой нагрузке, в сумме дает значительно больше памяти, чем на самом деле есть у машины.
Итак, отношения таковы:
- Частные байты — это то, что ваше приложение фактически выделило, но включает использование файла подкачки;
- Рабочий набор — это невыгружаемые частные байты плюс файлы с отображением в память;
- Виртуальные байты — это рабочий набор плюс выгружаемые частные байты и резервный список.
Здесь есть еще одна проблема; так же , как разделяемые библиотеки могут выделить память внутри модуля приложения, что приводит к потенциальным ложным срабатываниям сообщили в Байтах вашего приложения, ваше приложение может также в конечном итоге выделение памяти внутри общих модулей, что приводит к ложным негативам . Это означает, что в вашем приложении действительно может быть утечка памяти, которая вообще никогда не проявляется в байтах личного пользования. Маловероятно, но возможно.
Частные байты представляют собой разумное приближение к объему памяти, которое использует ваш исполняемый файл, и могут использоваться, чтобы помочь сузить список потенциальных кандидатов на утечку памяти; если вы видите, что число постоянно и бесконечно растет и растет, вы захотите проверить этот процесс на предмет утечки. Однако это не может служить доказательством наличия или отсутствия утечки.
Одним из наиболее эффективных инструментов для обнаружения / исправления утечек памяти в Windows на самом деле является Visual Studio (ссылка ведет на страницу использования VS для утечек памяти, а не на страницу продукта). Rational Purify — еще одна возможность. У Microsoft также есть документ с более общими рекомендациями по этому вопросу. В этом предыдущем вопросе перечислены другие инструменты .
Надеюсь, это проясняет некоторые моменты! Отслеживание утечек памяти — одна из самых сложных задач при отладке. Удачи.