Какова связь между GC, Finalize() и Dispose?

GC предназначен для управляемых объектов, а Finalize - для неуправляемых объектов, которые я читал. Dispose неявно, и Finalize is Explicit - это то, что я читал. Может ли кто-нибудь дать мне один пример одного модуля, в котором все три вещи использовались по разным причинам?

Ответ 1

GC - сборка мусора. Это автоматическое управление памятью, которое обрабатывает очистку объектов, выделенных в управляемой куче. В .NET GC используется алгоритм маркировки и развертки. Когда происходит сбор мусора, он в основном рассматривает весь объект в части кучи, подлежащей очистке, в качестве восстанавливаемого. Затем он проходит процесс маркировки, где он сканирует корни. То есть он идентифицирует объекты, которые все еще используются приложением. Сделав это, остальные объекты могут быть очищены. Куча может быть уплотнена как часть очистки.

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

Dispose должен быть вызван явно на тип, реализующий IDisposable. Его можно вызывать либо через метод Dispose(), либо через конструкцию using. GC не будет автоматически вызывать Dispose.

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

Dispose() позволяет детерминированную очистку ресурсов, в то время как финализатор может действовать как защитная сетка, если пользователь не вызывает Dispose().

Если тип реализует финализатор, очистка экземпляров задерживается, поскольку финализатор должен быть вызван до очистки. То есть для этого потребуется дополнительный сбор для восстановления памяти для экземпляров типа. Если тип также реализует IDisposable, можно вызвать метод Dispose, а затем экземпляр может удалить себя из финализации. Это позволит очистить объект, как если бы у него не было финализатора.

Если вы хотите вникнуть в это, я рекомендую CLR через С# Джеффри Рихтера. Это отличная книга, и она охватывает все детали этого вопроса (я оставил несколько деталей). Только что выпущено новое 3-е издание.

Ответ 2

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

Утилизировать или, более конкретно, IDisposable и шаблон Dispose, используется для обработки ресурсов отдельно от GC. Некоторые ресурсы необходимо очищать по-разному. Это включает в себя использование "родного" API (где .NET не знает о выделенной памяти), используя ресурс, который обертывает собственные дескрипторы и т.д. Чтобы обработать это чисто, вы реализуете IDisposable и шаблон Dispose.

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

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

Ответ 3

Вы можете просто прочитать, что я считаю окончательной статьей о IDisposable, финализаторах и сборке мусора, "" CLR Inside Out": выкапывание в IDisposable.

В этой статье очень мало сомнений по поводу темы.