Frage

Ich bin mit ANTS Memory Profiler, um zu versuchen und festzustellen, warum ist meine Anwendung Speichernutzung wächst weiter.

betreibe ich die Anwendung und nehmen verschiedene Schnappschüsse im Laufe der Zeit. Ich kann sehen, dass die Live-Instanzen von IWbemClassObjectFreeThreaded und Managementbase im Laufe der Zeit immer wieder zu erhöhen. Mit Blick auf die Klassenreferenz explorer ich sehen kann, dass IWbemClassObjectFreeThreaded von Managementbase verwiesen wird, und 100% der ManagementBaseObjects sind GC Roots, aber sie scheinen nie aufgeräumt werden. Wann sonst kann ich tun?

War es hilfreich?

Lösung

Dies ist ein ungewöhnliches Problem, aber es kann passieren. WMI ist COM basiert, ist die IWbemClassObject eine COM-Schnittstelle, die eine RCW-Wrapper wird. Dieser Wrapper nicht bekommen, bis die Finalizerthread läuft aufgeräumte. Es ist technisch möglich, eine Menge von WMI-Abfragen zu laufen, aber nicht genug tun, um die Arbeit mit den Ergebnissen die Garbage Collector zu laufen bekommen.

Diagnostizieren dies mit Perfmon.exe, Performance Monitor. Rechtsklick auf das Diagramm, Indikatoren hinzufügen, .NET CLR-Speicher und fügen Sie die # Gen 0 Kollektionen Zähler. Wählen Sie ein Programm aus der unteren Liste. Beachten Sie die Zähler, während Ihr Programm läuft. Sie werden dieses Problem haben, wenn es nicht tickt oben ist.

Wenn dies der Fall ist, Ihren Code überprüfen und überprüfen, ob es noch sinnvoll ist, so viele Anfragen zu laufen, aber nie oder nur selten die Ergebnisse verwenden. Eine Abhilfe ist, sie zu zählen und jeder, sagt, 100.000 Mal ruft GC.Collect () und GC.WaitForPendingFinalizers ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top