18

Desidero controllare il problema di perdita di memoria nel mio servizio. Ho provato a seguire una serie di segnalini perfmon.Contatori Perfmon per controllare la perdita di memoria

  1. Memoria CLR .NET \ # byte in tutti gli heap
  2. Memoria CLR .NET \ Gen 2 Dimensione heap
  3. Memoria CLR .NET \ # GC gestisce
  4. Memoria CLR .NET \ ° Pinned oggetti
  5. memoria CLR .NET \ # totale byte vincolati
  6. memoria CLR .NET \ # totale byte riservati
  7. memoria CLR .NET \ Large Object dimensione heap

ho fatto riferimento in precedenza insieme da here

Inoltre riferito seguente serie:

  1. Memoria/Disponibile Byte
  2. Memoria/Committed Bytes
  3. Processo/Byte privati ​​
  4. Processo/Pagina Byte di file
  5. Numero di processi/handle

ho fatto riferimento in precedenza insieme da here

C'è qualche parametro/criteri o qualsiasi altro modo migliore per identificare contatore perfmon per perdita di memoria?
Qualcuno può suggerirmi set di contatori per controllare la perdita di memoria? O sopra i set copre la perdita di memoria?

+0

Ecco un buon articolo http://www.codeproject.com/Articles/42721/Best-Practices-No-Detecting-NET-application-memo – CharithJ

risposta

26

Per rilevare una perdita di memoria utilizzando Performance Monitor, monitorare questi contatori:

  1. Il/Disponibile contatore Byte di memoria consente di visualizzare il numero totale di byte di memoria disponibile. Questo valore normalmente fluttua, ma se si dispone di un'applicazione con la perdita di memoria, si ridurrà oltre il tempo .
  2. Il contatore Memoria/Committed Bytes aumenta costantemente se si verifica una perdita di memoria, poiché al diminuire del numero di byte disponibili della memoria , il numero di byte impegnati aumenta.
  3. Il contatore Process/Private Bytes visualizza il numero di byte riservati esclusivamente per un processo specifico. Se si verifica una perdita di memoria , questo valore tenderà ad aumentare costantemente.
  4. Il contatore Byte file processo/pagina visualizza la dimensione del file di paging. Windows utilizza la memoria virtuale (il file di paging) per integrare una memoria fisica della macchina . Quando la memoria fisica di una macchina inizia a riempire , le pagine di memoria vengono spostate nel file di paging. È normale per il file di paging da utilizzare anche su macchine con molta memoria. Ma se la dimensione del file di paging aumenta costantemente, è un buon segno che si verifichi una perdita di memoria .
  5. Vorrei anche menzionare il contatore di Conteggio processo/maniglia. Le applicazioni utilizzano le maniglie per identificare le risorse a cui è necessario l'accesso .Se si verifica una perdita di memoria, un'applicazione spesso crea ulteriori handle per identificare le risorse di memoria. Quindi un aumento di il numero di handle potrebbe indicare una perdita di memoria. Tuttavia, non tutte le perdite di memoria provocheranno un aumento del numero di handle.

Source

Nella mia esperienza questo è accurato.

Vorrei anche fare riferimento a questo blog Microsoft Advanced Debugging di Tess, un dipendente Microsoft. Chi suggerisce i seguenti contatori. Ho trovato che quanto sopra è più che sufficiente per indicare che è presente una perdita di memoria, ma confido che le istruzioni di Tess possano fornire una comprensione più approfondita del problema.

Debugging Demos - Memory Review

  • Memoria CLR .NET/# byte in tutti gli heap
  • Memoria CLR .NET/Grande mucchio oggetto Size
  • Memoria CLR .NET/Gen dimensioni 2 mucchio
  • .NET Memoria CLR/Dimensione heap 1 Gen
  • Memoria CLR .NET/Gen 0 dimensione heap
  • Process/Private Bytes
  • Processo/Bytes virtuale
+0

Controllo alcuni processi Byte privati ​​e Byte di file di pagina, sono esattamente gli stessi (anche se ci sono diversi GB di memoria fisica libera). Questo significa veramente che l'intera memoria del processo proviene dal file di paging anziché dalla memoria fisica, oppure il significato dei byte dei file di pagina è più sfumato? – stijn

3

ci sono strumenti migliori a disposizione per fare memoria di perdite di testing più facile, come RedGate ANTS Memory Profiler e JetBrains dotMemory Profiler.

Tuttavia, se si desidera utilizzare i contatori delle prestazioni, this article spiega come utilizzare i contatori delle prestazioni per verificare le perdite di memoria.

Ricordare che Garbage Collection non rilascia memoria immediatamente dopo l'eliminazione di alcune istanze. È stato ottimizzato per attivare e rilasciare memoria solo in caso di stress della memoria. Quindi, se si desidera verificare le perdite di memoria, è necessario eseguire manualmente Garbage Collection prima di prendere le letture del contatore.

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

enter image description here