如何在C ++中获取Windows下的内存使用率

时间:2008-11-11 21:30:25

标签: c++ windows memory-management

我试图从程序本身中找出我的应用程序消耗了多少内存。我要查找的内存使用情况是Windows任务管理器的“进程”选项卡上“内存使用情况”列中报告的数字。

5 个答案:

答案 0 :(得分:45)

一个很好的起点是GetProcessMemoryInfo,它会报告有关指定进程的各种内存信息。您可以将GetCurrentProcess()作为进程句柄传递,以获取有关调用进程的信息。

WorkingSetSize的{​​{1}}成员可能是与任务管理器中Mem Usage coulmn最接近的匹配,但它不会完全相同。我会尝试使用不同的值来找到最符合您需求的值。

答案 1 :(得分:19)

我认为这就是你要找的东西:

#include<windows.h>
#include<stdio.h>   
#include<tchar.h>

// Use to convert bytes to MB
#define DIV 1048576

// Use to convert bytes to MB
//#define DIV 1024

// Specify the width of the field in which to print the numbers. 
// The asterisk in the format specifier "%*I64d" takes an integer 
// argument and uses it to pad and right justify the number.

#define WIDTH 7

void _tmain()
{
  MEMORYSTATUSEX statex;

  statex.dwLength = sizeof (statex);

  GlobalMemoryStatusEx (&statex);


  _tprintf (TEXT("There is  %*ld percent of memory in use.\n"),WIDTH, statex.dwMemoryLoad);
  _tprintf (TEXT("There are %*I64d total Mbytes of physical memory.\n"),WIDTH,statex.ullTotalPhys/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of physical memory.\n"),WIDTH, statex.ullAvailPhys/DIV);
  _tprintf (TEXT("There are %*I64d total Mbytes of paging file.\n"),WIDTH, statex.ullTotalPageFile/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of paging file.\n"),WIDTH, statex.ullAvailPageFile/DIV);
  _tprintf (TEXT("There are %*I64d total Mbytes of virtual memory.\n"),WIDTH, statex.ullTotalVirtual/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of virtual memory.\n"),WIDTH, statex.ullAvailVirtual/DIV);
  _tprintf (TEXT("There are %*I64d free Mbytes of extended memory.\n"),WIDTH, statex.ullAvailExtendedVirtual/DIV);


}

答案 2 :(得分:8)

GetProcessMemoryInfo是您正在寻找的功能。 MSDN上的文档将指出您正确的方向。从您传入的PROCESS_MEMORY_COUNTERS结构中获取所需的信息。

您需要包含psapi.h。

答案 3 :(得分:7)

试着看看GetProcessMemoryInfo。我没有使用它,但它看起来像你需要的。

答案 4 :(得分:2)

为了补充Ronin的答案,独立函数GlobalMemoryStatusEx为您提供了正确的计数器来获取调用进程的虚拟内存使用情况:只需从ullAvailVirtual中减去ullTotalVirtual即可获得分配虚拟内存。你可以使用ProcessExplorer或其他东西来检查这个。

令人困惑的是,系统调用GlobalMemoryStatusEx不幸地具有混合目的:它提供系统范围和特定于过程的信息,例如:虚拟内存信息。