Утечка памяти. ManagementBaseObject остается в качестве корня GC, но никогда не убран

StackOverflow https://stackoverflow.com/questions/3866371

Вопрос

Я использую 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 ().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top