Fuite de mémoire. séjours ManagementBaseObject comme GC Racine, mais jamais nettoyé
-
28-09-2019 - |
Question
J'utilise ANTS Profiler mémoire pour essayer de déterminer pourquoi continue de croître de ma demande utilisation de la mémoire.
Je lance l'application et prendre plusieurs clichés au fil du temps. Je vois que les instances en direct de IWbemClassObjectFreeThreaded et ManagementBaseObject ne cesse d'augmenter au fil du temps. En regardant la référence de classe explorateur Je vois que IWbemClassObjectFreeThreaded est référencé par ManagementBaseObject, et 100% des ManagementBaseObjects sont des racines GC, mais ils ne semblent jamais être nettoyé. Quand puis-je faire?
La solution
Ceci est un problème inhabituel, mais il peut arriver. WMI est COM base, l'IWbemClassObject est une interface COM qui obtient une enveloppe de RCW. Ces emballages ne sont pas ramassées jusqu'à ce que les courses de fil finaliseur. Il est techniquement possible d'exécuter un grand nombre de requêtes WMI mais pas faire assez de travail avec les résultats pour obtenir le garbage collector à courir.
avec ce Diagnostiquer Perfmon.exe, Analyseur de performances. Clic droit sur le graphique, Ajouter des compteurs, la mémoire .NET CLR et ajoutez le # 0 Gen Collections contre. Sélectionnez votre programme dans la liste en bas. Observez le compteur pendant que votre programme est en cours d'exécution. Vous aurez ce problème si elle n'est pas tic-tac vers le haut.
Si tel est le cas, passez en revue votre code et de vérifier si elle a encore un sens pour exécuter tant de requêtes, mais jamais ou rarement les résultats. Une solution consiste à les compter et tous, disons, 100.000 fois appel GC.Collect () et GC.WaitForPendingFinalizers ().