GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage始终为0

我正在使用GetProcessMemoryInfo函数来确定PID的进程内存使用情况。

使用常规的PROCESS_MEMORY_COUNTERS一切正常,但我需要PrivateUsage成员,只存在于扩展结构PROCESS_MEMORY_COUNTERS_EX。

有几个文件,这让我强制把扩展types转换为基本types,否则我的示例不会编译。

我仍然可以从基本成员获得价值,例如PeakWorkingSetSize,但PrivateUsage始终是0.我甚至试图重新定义PSAPI_VERSION – 仍然没有。 程序不能用PSAPI_VERSION <2编译。

这是我的例子。

#include <windows.h> #include <stdio.h> #include <tchar.h> #include <psapi.h> void _tmain (int argc, TCHAR *argv[]) { // use first argument as PID DWORD processID = strtol(argv[1],0, 0); HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE, FALSE, processID); PROCESS_MEMORY_COUNTERS_EX pmc; ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX)); // wait until process is dead WaitForSingleObject( hProcess , INFINITE ); GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) ); fprintf(stdout, " PeakWorkingSetSize : %d\n", pmc.PeakWorkingSetSize); fprintf(stdout, " PrivateUsage : %d\n", pmc.PrivateUsage); CloseHandle(hProcess); } 

我执行notepad.exe,然后我把它的PID程序上面,毕竟我closures记事本,并寻找结果,但PrivateUsage是零=(:

 C:\utils>simple.exe 45656 PeakWorkingSetSize : 6377472 PrivateUsage : 0 C:\utils> 

任何build议为什么发生?

 C:\utils>cl --version Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86 Copyright (C) Microsoft Corporation. All rights reserved. 

在WIN7x64上运行。

我知道这是一个相当古老的问题,你可能不需要一个答案。 但是你非常接近。 在进程关闭之后,您正在请求私有设置内存,因此对于不再存在的进程没有内存。 因此,私用是0。

相反,根据我的最佳看法,您应该在固定的时间间隔之后请求专用设置内存,直到进程终止。 如果你保持间隔非常低,如1毫秒,你可能已经接近过程的最终记忆。

例:

 PROCESS_MEMORY_COUNTERS_EX pmc; ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX)); //do for every millisecond until process terminates do { ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX)); GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) ); }while(WaitForSingleObject( hProcess , 1)); // wait until process is dead // WaitForSingleObject( hProcess , INFINITE ); // GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) ); fprintf(stdout, " PeakWorkingSetSize : %d\n", pmc.PeakWorkingSetSize); fprintf(stdout, " PrivateUsage (Bytes): %d\n", pmc.PrivateUsage); fprintf(stdout, " PrivateUsage (KB) : %f\n",(float)pmc.PrivateUsage/1024.0); CloseHandle(hProcess); 

进行上述变更后。 将获得以下输出

 C:\>PidMemory.exe 3456 PeakWorkingSetSize : 12427264 PrivateUsage (Bytes): 2269184 PrivateUsage (KB) : 2216.000000 

这可能有时会给零,因为在某些情况下,过程在条件检查之后已经终止。 因此,给一个体面的工作是保持PrivateUsage的历史。

例,

 int history=0; do { ZeroMemory(&pmc, sizeof(PROCESS_MEMORY_COUNTERS_EX)); GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc) ); if(pmc.PrivateUsage != 0) history = pmc.PrivateUsage; }while(WaitForSingleObject( hProcess , 1)); 

我希望我已经有用了。