Domanda

Sto usando ANTS Profiler di memoria per cercare di determinare il motivo per cui l'utilizzo di memoria di mia domanda continua a crescere.

I eseguire l'applicazione e prendere diverse istantanee nel corso del tempo. Vedo che le istanze dal vivo di IWbemClassObjectFreeThreaded e ManagementBaseObject continua ad aumentare nel corso del tempo. Guardando il riferimento alla classe Explorer vedo che IWbemClassObjectFreeThreaded fa riferimento ManagementBaseObject, e il 100% di ManagementBaseObjects sono Radici GC, ma non sembrano mai essere ripulito. Quando altro posso fare?

È stato utile?

Soluzione

Questo è un problema insolito ma può succedere. WMI è COM based, l'IWbemClassObject è un'interfaccia COM che ottiene un involucro RCW. Questi involucri non vengono pulite-up fino a quando viene eseguito il thread finalizzatori. E 'tecnicamente possibile eseguire un sacco di query WMI, ma non fare abbastanza lavoro con i risultati per ottenere il garbage collector per l'esecuzione.

diagnosticare questo con Perfmon.exe, Performance Monitor. Fare clic destro del grafico, Aggiungi contatori, memoria CLR .NET e aggiungere il # Gen 0 Collezioni contatore. Selezionare il programma dalla lista in basso. Osservare il contatore mentre il programma è in esecuzione. Avrete questo problema se non stringe in su.

Se questo è il caso, rivedere il codice e verificare se ha ancora senso per eseguire così tante domande, ma mai o raramente utilizzare i risultati. Una soluzione è quella di contarli e ogni, diciamo, 100.000 volte chiamano GC.Collect () e GC.WaitForPendingFinalizers ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top