在C ++ Win32 app中,如何确定专用字节,工作集和虚拟大小

时间:2009-05-14 22:31:54

标签: c++ winapi memory-management

我正在编写一些用于教育目的的代码,我希望能够从用C ++编写的Windows控制台程序中打印出这些内存使用值。

1 个答案:

答案 0 :(得分:13)

从这些链接中得到了一些摆弄到我想要的东西但是在这里。 (大多数困难是让它在Mingw32中运行。)

// -*- compile-command:"g++ mem.cpp -lpsapi -g -o mem.exe"; -*-

// Shows the memory: private bytes, working set and virtual size for a process 

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

// MingW32 doesn't have this struct in psapi.h
typedef struct _PROCESS_MEMORY_COUNTERS_EX {
  DWORD  cb;
  DWORD  PageFaultCount;
  SIZE_T PeakWorkingSetSize;
  SIZE_T WorkingSetSize;
  SIZE_T QuotaPeakPagedPoolUsage;
  SIZE_T QuotaPagedPoolUsage;
  SIZE_T QuotaPeakNonPagedPoolUsage;
  SIZE_T QuotaNonPagedPoolUsage;
  SIZE_T PagefileUsage;
  SIZE_T PeakPagefileUsage;
  SIZE_T PrivateUsage;
}PROCESS_MEMORY_COUNTERS_EX, *PPROCESS_MEMORY_COUNTERS_EX;

void PrintMemoryInfo( DWORD processID )
{
    HANDLE hProcess;
    PROCESS_MEMORY_COUNTERS_EX pmc;

    // Print the process identifier.

    printf( "\nProcess ID: %u\n", processID );

    // Print information about the memory usage of the process.

    hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION |
                                    PROCESS_VM_READ,
                                    FALSE, processID );
    if (NULL == hProcess)
        return;

    if ( GetProcessMemoryInfo( hProcess, (PROCESS_MEMORY_COUNTERS *) &pmc, sizeof(pmc)) )
    {
        printf( "\tWorkingSetSize: %u\n", pmc.WorkingSetSize );
        printf( "\tPrivate Bytes: %u\n", pmc.PrivateUsage );
        printf( "\tPagefile (peak): %u (%u)\n", pmc.PagefileUsage, pmc.PeakPagefileUsage  );

    }

    CloseHandle( hProcess );
}


int main()
{
    DWORD id = GetCurrentProcessId();

    PrintMemoryInfo(id);

    return 0;
}