Condividi tramite


Esempio 9: Rilevamento di una perdita di memoria del pool

Nell'esempio seguente vengono usati GFlags per impostare il flag di assegnazione di tag del pool a livello di sistema nel Registro di sistema. Usa quindi PoolMon (poolmon.exe), uno strumento in Windows Driver Kit, per visualizzare le dimensioni dei pool di memoria.

PoolMon monitora i byte nei pool di memoria paginati e non paginati e li ordina in base al tag del pool. Eseguendo periodicamente PoolMon, è possibile identificare i pool che si espandono continuamente nel corso del tempo. Questo modello spesso indica una perdita di memoria.

Nota L'assegnazione di tag al pool è abilitata in modo permanente in Windows Server 2003 e versioni successive di Windows. In questi sistemi, la casella di controllo Abilita tag del pool nella finestra di dialogo Flag globali viene disattivata e i comandi per abilitare o disabilitare l'assegnazione di tag del pool hanno esito negativo. Se l'assegnazione di tag del pool non è abilitata, PoolMon ha esito negativo e visualizza il messaggio seguente: "Pooltag di query Non riuscito c00000002".

Per rilevare una perdita di memoria del pool

  1. Per abilitare l'assegnazione di tag del pool per tutti i processi nelle versioni di Windows precedenti a Windows Server 2003, impostare il flag di assegnazione dei tag del pool a livello di sistema nel Registro di sistema. La riga di comando seguente usa il metodo di abbreviazione del flag, ma è possibile identificare il flag in base al relativo valore esadecimale o usare la finestra di dialogo Flag globali :

    gflags /r +ptg 
    
  2. Riavviare il computer per apportare la modifica effettiva del Registro di sistema.

  3. Eseguire PoolMon periodicamente usando il comando seguente. In questo comando il parametro /b ordina i pool in ordine decrescente.

    poolmon /b 
    

    In risposta, PoolMon visualizza le allocazioni dai pool di memoria in ordine decrescente, incluso il numero di operazioni di allocazione e operazioni gratuite e la quantità di memoria rimanente nel pool (nella colonna Byte).

    Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K
     Commit: 24140K Limit: 24952K Peak: 24932K  Pool N: 744K P: 2180K
    
     Tag  Type    Allocs          Frees         Diff   Bytes      Per Alloc
    -----------------------------------------------------------------------
    
     CM   Paged    1283 (   0)    1002 (   0)    281 1377312 (     0) 4901
    Strg  Paged   10385 (  10)    6658 (   4)   3727  317952 (   512)   85
     Fat  Paged    6662 (   8)    4971 (   6)   1691  174560 (   128)  103
    MmSt  Paged     614 (   0)     441 (   0)    173   83456 (     0)  482
    

    Se il valore nella colonna Byte per un'allocazione si espande continuamente per nessun motivo ovvio, potrebbe verificarsi una perdita di memoria in tale pool.

  4. Deselezionare il flag Abilita tag del pool .

    La riga di comando seguente usa il metodo di abbreviazione del flag, ma è possibile identificare il flag in base al relativo valore esadecimale o usare la finestra di dialogo Flag globali :

    gflags /r -ptg 
    
  5. Riavviare Windows per apportare la modifica effettiva del Registro di sistema.

Nota Usare il simbolo di accodamento (>>) per reindirizzare l'output PoolMon a un file di log. In seguito, è possibile esaminare il file di log per le tendenze delle dimensioni del pool. Ad esempio:

poolmon.exe /b >> poolmon.log