首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage总是0

GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage总是0
EN

Stack Overflow用户
提问于 2015-09-21 14:50:50
回答 1查看 4.9K关注 0票数 5

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

对于常规的计数器,所有工作都很好,但是我需要PrivateUsage成员,它只存在于扩展结构PROCESS_MEMORY_COUNTERS_EX中。

有几个文档,使我不得不将扩展类型强制转换为基本类型,否则我的示例将不会编译。

我仍然能够从基本成员(如PeakWorkingSetSize )中获得值,但是PrivateUsage始终是0。我甚至尝试过重新定义PSAPI_VERSION --仍然什么都没有。程序不能用PSAPI_VERSION < 2编译。

这是我的例子。

代码语言:javascript
复制
#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为0 =(:

代码语言:javascript
复制
C:\utils>simple.exe 45656
  PeakWorkingSetSize : 6377472
  PrivateUsage : 0

C:\utils>

有什么建议吗?

代码语言:javascript
复制
C:\utils>cl --version
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

在WIN7x64上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-04 12:08:46

我知道这是个很老的问题,你可能不需要回答。但你们很亲密。在进程关闭后,您请求私有集内存,因此不再存在一个进程的内存。因此,私有使用率为0。

相反,在我的最佳意见中,您应该在一个固定的时间间隔之后请求私有设置内存,直到进程终止为止。如果你保持很低的间隔,像1毫秒,你就可以得到进程的接近结束的内存。

示例:

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
C:\>PidMemory.exe 3456
 PeakWorkingSetSize : 12427264
 PrivateUsage (Bytes): 2269184
 PrivateUsage (KB) : 2216.000000

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

例如,

代码语言:javascript
复制
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));

我希望我能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32698298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档