вывоз мусора - PullRequest
       17

вывоз мусора

0 голосов
/ 28 марта 2011

если объект содержит метод finalize, но на него все еще ссылаются, удаляет ли сборщик мусора объект из кучи или просто очищает неуправляемые ресурсы

Ответы [ 4 ]

4 голосов
/ 28 марта 2011

GC в .NET не очищает автоматически неуправляемые ресурсы. Вот для чего IDisposable. finalize не будет вызываться, пока все ссылки больше не нужны.

0 голосов
/ 28 марта 2011

Finalize вызывается, когда объект собирается в мусор. Проще говоря, (хотя есть много исключений), если все ссылки на объект выходят из области видимости, когда GC просыпается (тонны условий могут вызвать его, но это обычно пороги памяти ) он вызовет finalize и затем восстановит управляемую память.

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

GC не будет заботиться о неуправляемом, но вам нужно внедрить шаблон Dispose, внедрив IDisposible.

0 голосов
/ 28 марта 2011

http://www.csharphelp.com/2006/08/garbage-collection/

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

Всякий раз, когда новый объект, имеющий Завершить метод, расположен на куча указатель на объект размещен внутренняя структура данных называется Очередь финализации. Когда объект не достижим, сборщик мусора считает объект мусором. сборщик мусора сканирует Очередь финализации ищет указатели на эти объекты. Когда указатель найден, указатель удален из очереди финализации и добавляется к другим внутренним данным структура называется Freachable queue, делая объект больше не является частью мусор. На данный момент, сборщик мусора закончил выявление мусора. Мусор коллектор уплотняет исправимую память и специальный поток времени выполнения очищает достижимую очередь, выполнение каждого объекта Finalize метод.

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

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

0 голосов
/ 28 марта 2011

Если на объект все еще ссылаются, у ГХ нет причин собирать его или запускать финализатор.

Кроме того, GC не очищает любые неуправляемые ресурсы. Он просто восстанавливает память, используемую вашими объектами. Вы должны очистить все свои неуправляемые ресурсы самостоятельно в финализаторе и, предпочтительно, IDisposable.Dispose().

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