Утилизировать и завершать

Anonim

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

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

Эта статья поможет вам понять разницу между ними.

Что такое метод утилизации?

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

Когда пользователи вызывают метод Dispose (), объект должен освобождать все свои дорогостоящие ресурсы, тем самым делая его доступным для повторного использования. Он никогда не вызывается сборщиком мусора, который только начинает играть, когда управляемая память становится скудной. Специальный интерфейс под названием «IDisposable» используется для определения того, где и как реализовать Dispose (). Но что происходит, когда метод dispose не вызван?

Что такое метод Finalize?

Если метод dispose не вызван, резервный план заключается в использовании метода Finalize () для очистки. Он вызывается сборщиком мусора для выполнения окончательной очистки ресурсов, прежде чем он освободит память. Концепция своевременной очистки становится неприменимой здесь, потому что вместо немедленного выделения памяти сразу объект добавляется в очередь финализации только для последующего уничтожения. Финализация больше похожа на гарантию, установленную в случае ошибки программирования, и dispose не очищает ресурсы, и в этом случае метод Finalize () вызывается сборщиком мусора для удаления недоступных объектов в любой последовательности, которая ему нравится.

Разница между Dispose и Finalize

Основы утилизации и завершения

Вызывается метод Dispose для ускорения выпуска неуправляемых ресурсов, таких как дескрипторы базы данных, дескрипторы файлов, семафоры и другие объекты, выделенные операционной системой. Метод dispose вызывается для выполнения кода, необходимого для очистки неиспользуемой памяти и ограниченных ресурсов, таких как дескрипторы GDI. Проще говоря, метод dispose обеспечивает управление явной очисткой памяти. С другой стороны, метод finalize является частью сборки мусора, используемой для выполнения окончательной операции очистки объекта, прежде чем он будет собирать мусор. Проще говоря, метод finalize называется свободным неуправляемым ресурсам, хранящимся объектом перед его уничтожением.

Вызов утилизации и завершения

Метод Dispose может быть явно вызван кодом пользователя и классом, который реализует метод выделения ресурсов. Однако память не может быть освобождена до тех пор, пока сборщик мусора не выполнит процесс очистки. Этот метод можно вызвать, даже если другие ссылки на объект все еще существуют. Метод finalize, напротив, может быть вызван сборщиком мусора только после того, как он определит, что последний экземпляр объекта памяти уничтожен и больше ссылок на объект не существует. После выполнения метода finalize объект удаляется из памяти кучи.

Внедрение утилизации и завершение

Процесс удаления объекта из памяти называется dispose pattern, который может использоваться для объектов, которые получают доступ к неуправляемым ресурсам, потому что сборщик мусора не может восстановить неуправляемые ресурсы. Интерфейс «IDisposable» наряду с дополнительным методом Dispose (Boolean) реализуется с запросом на выпуск неуправляемых ресурсов. Метод finalize выполняется, когда экземпляр объекта уничтожается до его освобождения. Это недетерминированный метод, который происходит по усмотрению сборщика мусора и может даже не произойти. Он не должен быть реализован на управляемых объектах, пока это крайне необходимо.

Производительность утилизации и завершения

Гораздо быстрее использовать метод удаления, а не готовить для мгновенного удаления объектов. Деструкторы автоматически преобразуются в метод finalize во время выполнения. Он автоматически вызывается сборщиком мусора, когда объект выходит из области действия, что обычно происходит, когда экземпляр этого объекта уничтожается. Проблема с методом finalize заключается в том, что он не является детерминированным значением, неясно, когда вернуть память, которая больше не ссылается на сборку мусора. Однако он может не освобождать память немедленно; на самом деле, он никогда не может быть вызван, и его нельзя принудительно запретить.

Dispose против Finalize: сравнительная таблица

Резюме Dispose vs Finalize

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

Другими словами, finalize является защитой, созданной для очистки неуправляемых ресурсов, когда метод dispose нельзя вызывать в случае некоторой ошибки программирования. Метод finalize вызывается сборщиком мусора, когда объект собирается вытолкнуть из памяти кучи.