Сборка мусора не работает должным образом - PullRequest
3 голосов
/ 05 января 2010

Возможно, это проблема моей неопытности в использовании управляемого языка.По сути, проблема заключается в цикле в методе объектов, который выполняется в течение примерно 20 секунд, на протяжении всего цикла этот общий объем использования программ постоянно увеличивается.Теперь все переменные в цикле, которые модифицируются, являются переменными, определенными в области видимости циклов (т. Е. Члены класса не изменяются / перераспределяются в цикле).После завершения всего метода избыточная память все еще используется.

Я абсолютно не знаю, почему / где эта проблема, но вот некоторые вещи, которые могут быть фактором:

  1. Я использую шрифты в цикле, но я «.Dispose ()» из них и проверил, что нет утечки GDI.
  2. У меня есть операторы try / catch, которые активно используются.
  3. Объекты распределены ...

Итак, любые идеи о том, откуда может возникнуть эта проблема, были бы очень полезны, я бы опубликовал код, но его много.Также, как упоминалось выше, память не очищается после выполнения вызова метода и даже после того, как объект, для которого был вызван метод, вышел из области видимости.

Редактировать

Я также только что попробовал метод GC.Collect (), и в общем результате ничего не изменилось.Понятия не имею, но значит ли это, что память не считается «мусором»?Опять же, все распределение выполняется в рамках цикла, поэтому его не следует считать мусором после завершения цикла.Я понимаю, что GC не сразу приступит к его очистке, но использование вызова GC.Collect () должно вызвать это?

Ответы [ 2 ]

3 голосов
/ 05 января 2010

.NET использует отслеживаемую сборку мусора вместо классического механизма подсчета ссылок .

Как только ваш код .NET освобождает объект или данные, он не очищается мгновенно. Это сидит некоторое время прежде, чем быть убранным. Сборщик мусора - это отдельная сущность, бродящая вокруг.

Microsoft заявляет о сборщике мусора

Однако память не бесконечна. В конце концов сборщик мусора должен выполнить коллекцию, чтобы освободить немного памяти.

Сборщик мусора будет приходить на свой досуг на основе сложных алгоритмов. Это в конечном итоге очистит все, если не в конце жизни программы. Не рекомендуется совать или подталкивать сборщика мусора через System.GC участников, потому что мы должны предположить, что он знает лучше

0 голосов
/ 05 января 2010

Сборщик мусора освобождает объекты, если на них нет указателя. Убедитесь, что вы не храните ненужные объекты в своих переменных (особенно в массивах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...