Утечка памяти. ManagementBaseObject остается как GC Root, но никогда не очищается - PullRequest
0 голосов
/ 05 октября 2010

Я использую ANTS Memory Profiler, чтобы попытаться определить, почему использование памяти моим приложением продолжает расти.

Я запускаю приложение и делаю различные снимки с течением времени. Я вижу, что в реальном времени экземпляры IWbemClassObjectFreeThreaded и ManagementBaseObject продолжают расти. Глядя на обозреватель ссылок на класс, я вижу, что на IWbemClassObjectFreeThreaded ссылается ManagementBaseObject, и 100% ManagementBaseObjects являются корнями GC, но, похоже, они никогда не очищаются. Когда еще я могу сделать?

1 Ответ

2 голосов
/ 06 октября 2010

Это необычная проблема, но она может случиться.WMI основан на COM, IWbemClassObject - это интерфейс COM, который получает оболочку RCW.Эти обертки не очищаются до тех пор, пока не завершится поток финализатора.Технически возможно выполнить много запросов WMI, но недостаточно выполнить работу с результатами, чтобы запустить сборщик мусора.

Диагностируйте это с помощью Perfmon.exe, системного монитора.Щелкните правой кнопкой мыши по графику, добавьте счетчики, память .NET CLR и добавьте счетчик # Gen 0 Collections.Выберите вашу программу из нижнего списка.Наблюдайте за счетчиком во время работы вашей программы.У вас возникнет эта проблема, если она не заработает.

Если это так, просмотрите ваш код и убедитесь, что все еще имеет смысл запускать так много запросов, но никогда или редко использовать результаты.Обходной путь - подсчитать их, и, скажем, каждый раз 100 000 раз вызывать GC.Collect () и GC.WaitForPendingFinalizers ().

...