我试图从程序本身中找出我的应用程序消耗了多少内存。我要查找的内存使用情况是 Windows 任务管理器的“进程”选项卡上“内存使用情况”列中报告的数字。
5 回答
一个好的起点是GetProcessMemoryInfo,它报告有关指定进程的各种内存信息。您可以GetCurrentProcess()
作为进程句柄传递,以获取有关调用进程的信息。
可能的WorkingSetSize
成员PROCESS_MEMORY_COUNTERS
是与任务管理器中的 Mem Usage 列最接近的匹配项,但不会完全相同。我会尝试不同的值,以找到最接近您需求的值。
我想这就是你要找的:
#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);
}
GetProcessMemoryInfo 是您正在寻找的功能。MSDN 上的文档将为您指明正确的方向。从您传入的 PROCESS_MEMORY_COUNTERS 结构中获取您想要的信息。
您需要包含 psapi.h。
尝试查看GetProcessMemoryInfo。我没有使用它,但它看起来像你需要的。
为了补充 Ronin 的答案,indead 函数GlobalMemoryStatusEx
为您提供了适当的计数器来得出调用进程的虚拟内存使用情况:只需减去即可ullAvailVirtual
获得ullTotalVirtual
分配的虚拟内存。您可以使用 ProcessExplorer 或其他工具自行检查。
令人困惑的是,系统调用GlobalMemoryStatusEx
不幸地具有混合目的:它提供系统范围和进程特定的信息,例如虚拟内存信息。