Freigeben über


Sammeln von Speicherauslastungsinformationen für einen Prozess

Um die Effizienz Ihrer Anwendung zu ermitteln, sollten Sie die 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 Standard-Funktion ruft mithilfe der EnumProcesses-Funktion eine Liste von Prozessen ab. Für jeden Prozess ruft Standard die PrintMemoryInfo-Funktion auf und übergibt den Prozessbezeichner. PrintMemoryInfo wiederum ruft die OpenProcess-Funktion auf, um das Prozesshandle abzurufen. Wenn OpenProcess fehlschlägt, wird in der Ausgabe nur der Prozessbezeichner angezeigt. Beispielsweise schlägt OpenProcess für die Prozesse Im Leerlauf und CSRSS fehl, da deren Zugriffseinschränkungen verhindern, dass Code auf Benutzerebene sie öffnet. Schließlich ruft PrintMemoryInfo die GetProcessMemoryInfo-Funktion auf, um die Informationen zur Speicherauslastung abzurufen.