Почему объекты не очищаются, как только они выходят за рамки? - PullRequest
2 голосов
/ 01 января 2012

В .net почему сборщик мусора не уничтожает объекты в тот момент, когда они находятся вне области видимости? Почему происходит ожидание следующего процесса очистки?

Ответы [ 5 ]

8 голосов
/ 01 января 2012

Этот проект был опробован Крисом Селлсом и Крисом Таваресом осенью 2003 года при финансовой поддержке Microsoft.Они изменили CLR (редакция Rotor), добавив поле счетчика ссылок для каждого объекта и изменив компилятор JIT, чтобы автоматически уменьшать счетчик, когда ссылка выходит из области видимости.И автоматически запускает финализатор, когда счетчик становится равным нулю.

Цель достигнута, больше нет необходимости в с использованием оператора .

Операция успешна, однако пациент умер,Модификации вызвали серьезное снижение производительности.Они пытались диагностировать это, обращаясь за помощью к Compuware, в то время ведущему поставщику инструментов.Но не мог прибить это.Сообщение в блоге, в котором опубликована ошибка , находится здесь , технические подробности здесь .

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

3 голосов
/ 01 января 2012

Для этого потребуется форма подсчета ссылок GC..NET GC относится к типу mark-and-sweep .

Объекты не выходят за рамки.Ссылки на объекты делают.И компилятор может легко отследить это, но есть ли другие ссылки на тот же объект?Это не так тривиально.

У подсчета ссылок есть 2 основные проблемы:

  1. компилятор должен генерировать дополнительный код каждый раз, когда ссылка передается, копируется или удаляется
  2. Когда два объекта ссылаются надруг у вас утечка памяти.
0 голосов
/ 01 января 2012

Потому что тогда вам понадобятся проверки каждый раз, когда назначается / изменяется любая ссылка (элемент объекта, переменная, элемент коллекции и т. Д.).И вам нужно будет отслеживать все ссылки на объект, например, сохраняя счет и обновляя его.Это называется подсчетом ссылок и имеет множество проблем, от общей производительности (каждое назначение ссылок требует сравнений и доступа к памяти) до накладных расходов на синхронизацию при наличии параллелизма (что произойдет, если два потока будут смешивать ссылки на один и тот же объект одновременно?), Чтобыневозможность обнаружить циклы (если A относится к B, а B относится к A, ни один счетчик ссылок не может упасть до 0, поэтому вы теряете память или вам все еще нужен «полный» GC, как описано ниже).

Вместобольшинство сборщиков мусора просто позволяют ссылкам приходить и уходить, и если им нужно собирать, они следуют ссылкам, которые существуют в настоящее время, чтобы определить, какие объекты используются (соответственно, может использоваться, поскольку они достижимы)и освободить остальных.Очевидно, что это большая работа, поэтому вы делаете это только время от времени.Существует несколько более изощренных подходов, которые минимизируют объем работы в среднем или предпочитают собирать области кучи, которые более вероятны.Но общая проблема остается: вы не можете найти весь мусор, как только он станет мусором, поскольку это будет означать обход всей кучи каждый раз, когда меняется ссылка.

0 голосов
/ 01 января 2012

Ну, не процесс, а поток.

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

Алгоритмов сбора мусора достаточно: см. здесь .Целью алгоритма сборки мусора является как можно меньше времени на выполнение кода.Сбор мусора сразу после того, как объекты выйдут из области видимости, на самом деле не подходит под этот счет ...

0 голосов
/ 01 января 2012

Приложение / система могут быть заняты другими делами. Таким образом, немедленный запуск GC может привести к снижению производительности. Система пытается определить наилучшее время для запуска ГХ.

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