GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage 始终为 0
GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage always 0
我正在使用 GetProcessMemoryInfo 函数通过其 PID 确定进程内存使用情况。
使用常规 PROCESS_MEMORY_COUNTERS 一切正常,但我需要 PrivateUsage 成员,它仅存在于扩展结构 PROCESS_MEMORY_COUNTERS_EX.
有几个文档促使我强制将扩展类型转换为基本类型,否则我的示例无法编译。
我仍然能够从基本成员获取值,例如 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放到上面的程序中,最后我关闭记事本并查找结果但PrivateUsage为零=(:
C:\utils>simple.exe 45656
PeakWorkingSetSize : 6377472
PrivateUsage : 0
C:\utils>
有什么建议吗?
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
这有时可能会给出零,因为在某些情况下,进程在 while 条件检查后已终止。因此,给出 0。一个体面的解决方法是保留 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));
希望对您有所帮助。
我正在使用 GetProcessMemoryInfo 函数通过其 PID 确定进程内存使用情况。
使用常规 PROCESS_MEMORY_COUNTERS 一切正常,但我需要 PrivateUsage 成员,它仅存在于扩展结构 PROCESS_MEMORY_COUNTERS_EX.
有几个文档促使我强制将扩展类型转换为基本类型,否则我的示例无法编译。
我仍然能够从基本成员获取值,例如 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放到上面的程序中,最后我关闭记事本并查找结果但PrivateUsage为零=(:
C:\utils>simple.exe 45656
PeakWorkingSetSize : 6377472
PrivateUsage : 0
C:\utils>
有什么建议吗?
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
这有时可能会给出零,因为在某些情况下,进程在 while 条件检查后已终止。因此,给出 0。一个体面的解决方法是保留 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));
希望对您有所帮助。