Утечка памяти. ManagementBaseObject остается в качестве корня GC, но никогда не убран
-
28-09-2019 - |
Вопрос
Я использую Ants Memory Profiler, чтобы попытаться определить, почему использование памяти моего приложения продолжает расти.
Я запускаю приложение и со временем принимаю различные снимки. Я вижу, что живые экземпляры IWBEMClassobjectFreethreaded и ManagementBaseObject продолжают растут со временем. Глядя на ссылочный проводник класса, я вижу, что iwbemclassobjectFreethreaded Management ManagementSbaseObject, а 100% управленийBaseObjects - это корни GC, но они никогда не убираются. Когда я могу сделать?
Решение
Это необычная проблема, но это может произойти. WMI является COM на основе, iWbemclassObject - это интерфейс COM, который получает оболочку RCW. Эти обертки не очищаются, пока не работает финализатор. Технически можно запустить много запросов WMI, но не делать достаточно работы с результатами, чтобы получить сборщик мусора для запуска.
Диагностируйте это с Perfmon.exe, монитор производительности. Щелкните правой кнопкой мыши график, добавьте счетчики, память .NET CLR и добавьте счетчик коллекций # GEN 0. Выберите вашу программу из нижнего списка. Соблюдайте счетчик, пока ваша программа работает. У вас будет эта проблема, если она не тикает.
Если это так, просмотрите свой код и убедитесь, что он имеет смысл запускать так много запросов, но никогда не или редко используйте результаты. Обходной путь состоит в том, чтобы считать их и каждый, скажем, 100 000 раз вызовите gc.collect () и gc.waitforpendingfinkinefinalizers ().