草庐IT

c - GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage 始终为 0

coder 2024-06-04 原文

我正在使用 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 上运行。

最佳答案

我知道这是一个很老的问题,您可能不需要回答。但你们非常亲密。您在进程关闭后要求私有(private)集内存,因此不再存在的进程没有内存。因此,Private Usage 为 0。

相反,在我看来,您应该在固定的时间间隔后请求私有(private)集内存,直到进程终止。如果您将间隔保持得非常低,例如 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));

希望我对您有用。

关于c - GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage 始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698298/

有关c - GetProcessMemoryInfo PROCESS_MEMORY_COUNTERS_EX.PrivateUsage 始终为 0的更多相关文章

  1. ruby - 使用 WWW :Mechanize to download a file to disk without loading it all in memory first - 2

    我正在使用Mechanize来简化某些文件的下载。目前我的脚本使用以下行来实际下载文件...agent.get('http://example.com/foo').save_as'a_file_name'然而,这会将完整的文件下载到内存中,然后再将其转储到磁盘。你如何绕过这种行为,直接下载到磁盘?如果我需要使用WWW:Mechanize以外的东西,那么我将如何使用WWW:Mechanize的cookies呢? 最佳答案 您真正想要的是Mechanize::Downloadhttp://mechanize.rubyforge.org/

  2. ruby-on-rails - rails Assets 管道 "Cannot allocate memory - nodejs" - 2

    我们刚刚从Rails3.0.7升级到Rails3.2.5,并为暂存服务器即时使用Assets管道编译,但有时我们会遇到这个异常!Showing/var/rails/appname/app/views/common/_my_partial.html.hamlwhereline#raised:Cannotallocatememory-nodejs/tmp/execjs20120613-17090-thoc8f.js2>&1Extractedsource(aroundline#):Traceoftemplateinclusion:app/views/layouts/application.h

  3. ARM异常处理(3):Bus faults、Memory management faults、Usage faults、Hard faults详解 - 2

    之前介绍了了ARM异常处理(1):异常类型、优先级分组和异常向量表,里面有很多异常类型,其中有几个异常在错误处理中非常有用:文章目录1BusFault2MemoryManagementFault3Uagefaults4HardFaults1BusFault当在AHB接口上传输期间收到错误响应时,就会产生Busfault。它可能发生在以下几个阶段:指令预取阶段,通常称为prefetchabort数据读/写阶段,通常称为dataabort在Cortex-M3中,出现下面几种情况也会产生Busfault:堆栈在中断处理的开始处PUSH,称为stackingerror堆栈在中断处理的结束处POP,称为

  4. javascript - Node : Why pm2 list shows memory keeps on increasing? - 2

    我将HAPI.JS框架与NodeJS结合使用并创建了一个代理。认为代理意味着我只是在redis中维护session。除此之外,我没有在代码中做任何事情。可能唯一的问题是我每3分钟使用setInterval记录我的process.memoryUsage()。我的问题:为什么我的内存力一直在增加?它会下降吗?发生这种情况是否是因为setInterval不断记录进程使用情况?这是由于每个请求和响应的控制台日志记录导致的吗?我的Redis数据库一直保持打开状态,直到我的服务器崩溃,这是造成这种情况的原因吗?我是否需要使用流程管理器(如newrelic或strongloop)来识别它?那么这个内

  5. javascript - angular2-in-memory-web-api 404 错误 - 2

    我正在尝试按照本指南以Angular2构建5分钟的应用程序:https://angular.io/docs/ts/latest/tutorial/toh-pt6.html.在http部分,我添加了一个假服务器,但我收到404错误,因为angular2-in-memory-web-api.http://localhost:4200/vendor/angular2-in-memory-web-api/in-memory-backend.service.jsFailedtoloadresource:theserverrespondedwithastatusof404(NotFound)我试图

  6. JavaScript "cache"与 "memory" - 2

    如果您在Stackoverflow上搜索如何在JS中缓存变量,您会找到指向例如cookie或本地存储的答案。另一方面,“缓存”一词经常这样使用:“缓存数组的长度,这样我们就不必每次都计算它”。当然,我们不会在cookie或本地存储中缓存长度。我的问题是:“缓存”长度的位置在哪里?它在内存中吗?如果是这样,我们为什么要使用“缓存”这个词? 最佳答案 这是一个非常多的问题,看来您在这里混淆了很多概念。希望这有助于:对于您的问题““缓存”长度的位置在哪里?它在内存中吗?”给定某个值的任何变量都存储在内存中的特定位置。在JavaScript

  7. javascript - 是否可以在 headless chrome 中使用 window.performance.memory? - 2

    我想使用window.performance.memory来测量我的headlesschrome测试中是否有任何内存泄漏。在测试中:beforeEach(()=>{$('body').append(initHtml);console.log(window.performance.memory)});结果:MemoryInfo{}在开发控制台中:console.log(window.performance.memory)结果:MemoryInfo{totalJSHeapSize:27600000,usedJSHeapSize:16100000,jsHeapSizeLimit:153000

  8. javascript - 在 : memory allocation versus large object manipulation 中 - 2

    我有一个维护和操作大量数据的JavaScript模块。我有四个大型结构——每个基本上都是数组对象的对象的对象。他们里面有很多数据。当用户执行删除或更新等操作时,我需要遍历每个结构并可靠地修改结构以反射(reflect)更改。在某些结构中,根据用户操作,我不知道我需要更改哪个“叶”对象,所以我必须遍历所有对象,等等。在发生变化时操纵这些大型结构的另一种方法是将它们清空并从原始数据中重建它们。这就是我的问题:从性能的Angular来看,在Javascript中,循环遍历和修改现有(大型)数据结构或简单地从原始数据重建结构是否更优化?我确定答案可能是“视情况而定”,但是a)假设有大量数据;b

  9. javascript - Node : How to free buffers that get allocated outside of the V8 memory heap - 2

    我有一个应用程序,我按顺序从服务器下载mp3文件,将它们临时存储在我的服务器中,然后将它们直接流式传输到客户端,如下所示:functiondownloadNextTrack(){varrequest=http.get('http://mp3server.com',function(response){response.on('data',function(data){fs.appendFile('sometrack.mp3',data,function(err){});});response.on('end',function(){streamTrack('sometrack.mp3'

  10. Javascript 闭包 : Memory Leak - 2

    我有一个我不明白的内存泄漏。我编写了一种机制来处理半自动解除绑定(bind)的事件,这应该可以让我轻松清理内存。但在一种情况下,清理不会发生(我使用chrome的“配置文件(内存堆)”来检查是否有剩余的“EventHandler”实例)。我真的不明白为什么会这样。关闭有一些奇怪的东西......seeitinactionwithchromefunctionBind(obj,f){returnfunction(){returnf.apply(obj,arguments);}}functionEventHandler(){this.listeners=newObject();var_lis

随机推荐