Что такое "Виртуальный размер" в sysinternals process explorer
Мое приложение работает в течение нескольких часов. Нет увеличения какого-либо значения (vmsize, memory) диспетчера задач. Но через несколько часов я получаю ошибки в памяти.
В sysinternals я вижу, что "Виртуальный размер" постоянно увеличивается, и когда он достигает около 2 ГБ, я начинаю получать ошибки памяти.
Так какая же утечка памяти?
Как я могу продемонстрировать это с помощью кода? Можно ли воспроизвести одну и ту же вещь с любым фрагментом кода, в котором ни одно из значений памяти не увеличивается, а только виртуальный размер в sysinternsl explorer увеличивается?
спасибо за любые предложения
Ответы
Ответ 1
Виртуальный размер - это количество страниц, которые был выделен процессом,
страницы, которые в настоящее время не находятся в рабочем наборе (физически загруженные в ОЗУ), будут в файле системной страницы.
Обычно вы выделяете память, которая не освобождается. Это может быть сложно отследить в коде без специальных инструментов, например Rational Purify или Boundschecker. С sysinternals вы видите, что там должна быть утечка, но это не будет означать, что вы...
Если ваше программное обеспечение не так велико, вы можете попытаться выйти из "нового" и "удалить" и посмотреть, есть ли слишком много объектов в памяти, управляя списками выделенных объектов (таким образом, делая свой собственный отладчик памяти), В мире Windows есть помощники, такие как утилиты проверки памяти CRT из Microsoft. Они полезны в некоторых случаях.
Ответ 2
Из звука вещей у вас заканчивается адресное пространство. 32-разрядная Windows разбивает адресное пространство наполовину, половину для пользовательской программы и половину для системы, поэтому каждый получает 2 гигабайта.
Наиболее распространенной причиной этого является фрагментация пространства памяти до такой степени, что вы не можете найти кусок, достаточно большой для распределения. К сожалению, не зная больше о том, что вы делаете, трудно догадаться, почему это может произойти, хотя.
Ответ 3
В соответствии с этот поток на форуме sysinternals, виртуальный размер соответствует адресному пространству процесса (я предполагаю, что забронировано и зарезервировано страниц памяти)
Ответ 4
Кажется, что Virtual Size включает выделенные страницы со следующими типами:
MEM_MAPPED (для просмотра данных)
MEM_IMAGE (для исполняемых изображений)
MEM_PRIVATE (обычная выделенная память страниц)
Это не единственная "память" для данных, но также включает пространство страниц для *.dll-s и механизма FileMapping.