Как определить процесс "виртуальный размер" (WinXP)? - PullRequest
10 голосов
/ 14 февраля 2009

У меня есть программа, которой требуется много памяти, и она падает, как только достигается виртуальное адресное пространство 2 ГБ. Sysinternals Process Explorer отображает это как «виртуальный размер» столбца. Как я могу определить этот «виртуальный размер» с помощью кода C (или C ++)?

Хорошо, мне нужно запросить счетчик производительности для «Виртуальных байтов». Perfmon показывает строку запроса (или как она называется) как, например, '\ Process (firefox) \ Virtuelle Größe' в моей немецкой установке Win XP.

Как определить строку запроса для «текущего процесса» и есть ли для нее нелокализованное имя?

Ответы [ 6 ]

8 голосов
/ 14 февраля 2009

Согласно MSDN: информация о производительности памяти PROCESS_MEMORY_COUNTERS_EX.PrivateUsage соответствует размеру виртуальной машины в диспетчере задач в Windows XP. GetProcessMemoryInfo должно работать:

PROCESS_MEMORY_COUNTERS_EX pmcx = {};
pmcx.cb = sizeof(pmcx);
GetProcessMemoryInfo(GetCurrentProcess(),
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb);

Теперь pmcx.PrivateUsage содержит размер виртуальной машины процесса.

1 голос
/ 04 ноября 2009

Мне нужно было то же самое, что и theller, но, к сожалению, это было нужно для процесса, отличного от моего. Из-за этого сам ответ пользователя об использовании «MEMORYSTATUSEX.ullTotalVirtual – MEMORYSTATUSEX.ullAvailVirtual» у меня не работал, поскольку GlobalMemoryStatusEx () (функция, которая возвращает MEMORYSTATUXEX) работает только для текущего процесса.

Пока что мне не удалось найти именно то, что я искал, без использования счетчиков производительности (я не разбирался в них, потому что они выглядели намного сложнее, чем то, что я искал). Я очень близко подошел к циклу и использовал «VirtualQueryEx» для изучения адресного пространства нужного процесса, подсчитав все регионы, которые не имели состояния MEM_FREE. В моих тестах она оказалась на 17M выше, чем я ожидал по сравнению с Process Explorer. ... Кроме того, это, безусловно, не бесплатно гоночных условиях.

Во всяком случае, я знаю, что это, скорее, не ответ, но я решил, что, по крайней мере, задокументирую прогресс, который я сделал в этом для тех, кто наткнется на это в следующий раз.

1 голос
/ 14 февраля 2009

Вы можете использовать счетчик производительности. Процесс Объект имеет значение «Виртуальные байты».

1 голос
/ 14 февраля 2009

Вы запрашиваете счетчик производительности.
В Win32 API есть полный API для этого, читайте об этом здесь .
Вы можете посмотреть все счетчики производительности, если запустите программу «perfmon.exe»

0 голосов
/ 14 февраля 2009

Вам не нужны счетчики производительности. Просто используйте NAPI (FAQ по Win32)

см. В новостях группы win32: //nntp.aioe.org/comp.os.ms-windows.programmer.win32 для кода С.

0 голосов
/ 14 февраля 2009

В 32-битном адресном пространстве WindowsXP разделен на две части по 2 ГБ: одна часть для программы, а другая для ядра. Вы можете увеличить часть приложения до 3 ГБ, используя переключатель / 3 ГБ в файле boot.ini .

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