Что такое "Виртуальный размер" в 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.