Виртуальный размер и GlobalMemoryStatusEx - PullRequest
0 голосов
/ 02 февраля 2010

Моя система - Windows XP. Виртуальный размер, отображаемый в TaskManager, отличается от MEMORYSTATUSEX.ullAvailVirtual, полученного от GlobalMemoryStatusEx.

Когда я создаю много буферов и использование памяти увеличивается, MEMORYSTATUSEX.ullAvailVirtual вполне может отражать использование виртуального размера. Это то же самое.

Но когда я удаляю память, виртуальный размер в диспетчере задач не работает, но MEMORYSTATUSEX.ullAvailVirtual все еще очень мал. Я не знаю почему ....

Я в полном замешательстве.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2010

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

Чтобы действительно освободить удаленную память, вы можете позвонить

SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1);

Может быть, это заставит GlobalMemoryStatusEx () вернуть ожидаемые значения?

0 голосов
/ 02 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...