Non sono esperto in questo settore ma ho notato che è possibile utilizzare i contatori delle prestazioni del runtime .NET per il monitoraggio di alcune cose interessanti - uno di questi è il numero di byte che è stato assegnato dal garbage collector durante la sua ultima collezione. La descrizione di Allocated Bytes/second
in Performance Counters in the .NET Framework paese:
Visualizza il numero di byte al secondo allocati sul mucchio garbage collection. Questo contatore viene aggiornato alla fine di ogni raccolta di dati inutili, non ad ogni allocazione. Questo contatore non è una media nel tempo; mostra la differenza tra i valori osservati negli ultimi due campioni divisi per la durata dell'intervallo di campionamento.
Secondo le mie prove, se si imposta l'intervallo di aggiornamento del monitor prestazioni a 1 secondo e prendere un buon guardare l'indicatore relativo Allocated Bytes/second
, sembra mostrare un valore di 0
dopo una raccolta è stata completata. Quindi suppongo che tu possa derivare da questo valore se una raccolta è in corso o meno.
L'ho verificato creando una piccola applicazione in VS 2015 che ha la capacità di mostrare se è in corso una garbage collection. Il valore dell'indicatore era diverso da 0 se era il caso.
Aggiornamento (Grazie Thomas)
E 'possibile utilizzare ProcDump per monitorare il contatore delle prestazioni e creare la discarica in modo automatico. Il modo corretto per farlo sarebbe: procdump ProcessName -s 1 -ma -pl "\.NET CLR Memory(ProcessName)\Allocated Bytes/second" 1000
che attiverà la discarica se il valore scende sotto il migliaio.
Questo dovrebbe funzionare in quanto il valore è solo zero se non è in corso alcuna garbage collection.
Se non si utilizza una versione inglese del sistema operativo, è necessario individuare il nome specifico della lingua corretta del contatore delle prestazioni (è possibile fare riferimento al collegamento MSDN fornito sopra e passare a un altro lingua lì). Per esempio. il nome tedesco sarebbe "\.NET CLR-Speicher(ProcessName)\Zugeordnete Bytes/Sek."
.
fonte
2015-11-22 11:28:19
Si consiglia di utilizzare PerfView che è stato progettato pensando a questo problema. Aiuto | La Guida utenti ha una sezione chiamata "Raccolta heap GC: bloccare o non congelare?" che discute questo. Il collegamento per il download è: http://www.microsoft.com/en-us/download/details.aspx?id=28567 –
Inviami una riga se hai bisogno di aiuto implementando/testando la mia risposta. –
@Mark: nella tua applicazione, ha dei processi in background? Voglio dire, se l'utente non sta usando può ancora elaborare qualcosa dietro la scena? – CharithJ