How to determine a process “virtual size” (WinXP)?

前端 未结 6 1589
渐次进展
渐次进展 2020-12-31 12:27

I have a program that needs a lot of memory, and it crashes as soon as the 2GB virtual address space is reached. Sysinternals process explorer displays this as \"virtual si

相关标签:
6条回答
  • 2020-12-31 12:54

    You query a performance counter.
    There is a complete API for this in the win32 API, read about it here.
    You can look at all the performance counters if you run a program called 'perfmon.exe'

    0 讨论(0)
  • 2020-12-31 12:55

    You can use a performance counter. The Process Object has a "Virtual Bytes" value.

    0 讨论(0)
  • 2020-12-31 13:00

    You don't need performance counters. Just use NAPI (Win32 FAQ)

    see on win32 group news://nntp.aioe.org/comp.os.ms-windows.programmer.win32 for C code.

    0 讨论(0)
  • 2020-12-31 13:13

    In 32bit WindowsXP address space is divided in two 2GB parts: one part for the program and the other for the kernel. You can increase application part to 3GB using the /3GB switch in the boot.ini file.

    0 讨论(0)
  • 2020-12-31 13:15

    According to MSDN: Memory Performance Information PROCESS_MEMORY_COUNTERS_EX.PrivateUsage is the same as VM Size in Task Manager in Windows XP. GetProcessMemoryInfo should work:

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

    Now pmcx.PrivateUsage holds the VM Size of the process.

    0 讨论(0)
  • 2020-12-31 13:17

    I needed the same thing as theller, but unfortunately needed it for a process other than my own. Because of this, theller's self-answer of using "MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual" didn't work for me, since GlobalMemoryStatusEx() (the function that returns MEMORYSTATUXEX) only works for the current process.

    So far, I've been unable to find exactly what I was looking for without using performance counters (I didn't get into those because they looked way more complex than what I was looking for). I got very close by looping around and using "VirtualQueryEx" to explore the address space of the desired process, counting up all of the regions that didn't have a State of MEM_FREE. In my tests, it seemed to be a constant 17M higher than I would have expected when comparing to Process Explorer. ...also, it is certainly not race-condition free.

    Anyway, I know this is sorta a non-answer, but I figured I'd at least document the progress I'd made on this for whoever stumbles upon this next.

    0 讨论(0)
提交回复
热议问题