Sammeln von Speicherauslastungsinformationen für einen Prozess
Um die Effizienz Ihrer Anwendung zu bestimmen, können Sie deren Speicherauslastung untersuchen. Im folgenden Beispielcode wird die GetProcessMemoryInfo-Funktion verwendet, um Informationen zur Speicherauslastung eines Prozesses abzurufen.
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1
void PrintMemoryInfo( DWORD processID )
{
HANDLE hProcess;
PROCESS_MEMORY_COUNTERS 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, &pmc, sizeof(pmc)) )
{
printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
printf( "\tPeakWorkingSetSize: 0x%08X\n",
pmc.PeakWorkingSetSize );
printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakPagedPoolUsage );
printf( "\tQuotaPagedPoolUsage: 0x%08X\n",
pmc.QuotaPagedPoolUsage );
printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaPeakNonPagedPoolUsage );
printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n",
pmc.QuotaNonPagedPoolUsage );
printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage );
printf( "\tPeakPagefileUsage: 0x%08X\n",
pmc.PeakPagefileUsage );
}
CloseHandle( hProcess );
}
int main( void )
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
{
return 1;
}
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the memory usage for each process
for ( i = 0; i < cProcesses; i++ )
{
PrintMemoryInfo( aProcesses[i] );
}
return 0;
}
Die main-Funktion ruft mithilfe der EnumProcesses-Funktion eine Liste von Prozessen ab. Für jeden Prozess ruft main die PrintMemoryInfo-Funktion auf und übergibt den Prozessbezeichner. PrintMemoryInfo ruft wiederum die OpenProcess-Funktion auf, um das Prozesshandle abzurufen. Wenn OpenProcess fehlschlägt, zeigt die Ausgabe nur den Prozessbezeichner an. Beispielsweise schlägt OpenProcess für die Prozesse Idle und CSRSS fehl, da deren Zugriffseinschränkungen verhindern, dass sie von Code auf Benutzerebene geöffnet werden. Schließlich ruft PrintMemoryInfo die GetProcessMemoryInfo-Funktion auf, um die Speicherauslastungsinformationen abzurufen.