Что такое виртуальный размер в обозревателе процессов sysinternals

Мое приложение работает в течение нескольких часов, в диспетчере задач не увеличивается какое-либо значение (vmsize, память). Но через несколько часов я получаю ошибки памяти.

В sysinternals я вижу, что «виртуальный размер» постоянно увеличивается, и когда он достигает около 2 ГБ, я начинаю получать ошибки памяти.

Так что же это за утечка памяти? Как я могу продемонстрировать это с помощью кода? Можно ли воспроизвести то же самое с любым фрагментом кода, в котором не увеличивается значение памяти, а увеличивается только виртуальный размер в обозревателе процессов sysinternsl?

спасибо за любые предложения


person robert    schedule 12.06.2010    source источник
comment
Этот вопрос должен иметь тег Windows. У меня возник соблазн ответить из Linux pov ;)   -  person Dummy00001    schedule 13.06.2010


Ответы (4)


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

Обычно вы выделяете память, которая не освобождается. Это может быть трудно отследить в коде без специальных инструментов, таких как, например, Rational Purify или Boundschecker. С sysinternals вы видите, что должна быть утечка, но она ни в коем случае не скажет вам, где...

Если ваше программное обеспечение не такое большое, вы можете попробовать выйти из системы «новое» и «удалить» и посмотреть, не слишком ли много объектов в памяти, управляя списками выделенных объектов (так сказать, создав свой собственный отладчик памяти). В мире Windows есть несколько помощников, таких как утилиты проверки памяти CRT от Microsoft. Они полезны в некоторых случаях.

person jdehaan    schedule 12.06.2010

Судя по всему, у вас заканчивается адресное пространство. 32-разрядная Windows делит адресное пространство пополам: одна половина для пользовательской программы, а другая половина для системы, поэтому каждому из них выделяется 2 гигабайта.

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

person Jerry Coffin    schedule 12.06.2010

Согласно этой ветке на форуме sysinternals, виртуальный размер соответствует адресному пространству процесс (я предполагаю, что зафиксированы и зарезервированы страницы памяти)

person Anders    schedule 12.06.2010

Кажется, что виртуальный размер включает выделенные страницы со следующими типами: MEM_MAPPED (для просмотра данных) MEM_IMAGE (для просмотра исполняемого изображения) MEM_PRIVATE (обычная выделенная страничная память)

Это не единственная «память» для данных, но также включает в себя страничное пространство для *.dll-файлов и механизм FileMapping.

person bruziuz    schedule 09.09.2014