При работе с классами в Java конструкторы используются для инициализации экземпляра класса. Память выделяется для объекта с помощью конструктора, но после того, как жизненный цикл объекта завершен и объект больше не используется, память должна быть освобождена.
Деструктор — это специальный метод в Java, который вызывается автоматически после завершения жизненного цикла объекта для освобождения памяти. Следующие задачи выполняются при его вызове:
- Разблокировка.
- Закрытие всех подключений к базе данных или файлов.
- Освобождение всех сетевых ресурсов.
- Освобождение пространства, выделенного во время жизни объекта.
Деструкторы, также известные как финализаторы, являются недетерминированными. Выделение и освобождение памяти неявно обрабатываются сборщиком мусора в Java.
Финализаторы должны вызываться неявно, поскольку их вызов не гарантирован, в отличие от финализаторов C #, которые вызываются во время выполнения .NET.
Давайте посмотрим на ключевые свойства деструктора:
- Перегрузка или наследование не допускаются.
- Нет спецификации модификаторов доступа или параметров.
- Автоматический вызов и отсутствие явного вызова от пользователя.
- Используется в классах, но не в структурах.
- Порядок класса варьируется от самого производного класса до наименее производного класса.
- Также вызывается, когда экземпляр объекта больше не имеет права на доступ.
- Используется для высвобождения неуправляемых ресурсов вместо управляемых ресурсов, удерживаемых объектом.
Сборщик мусора
Сборщик мусора — это программа, которая запускается на виртуальной машине Java для восстановления памяти путем удаления объектов, которые больше не используются или закончили свой жизненный цикл. Говорят, что объект имеет право на сборку мусора тогда и только тогда, когда объект недоступен.
Сборка мусора — это, главным образом, процесс маркировки или идентификации недоступных объектов и удаления их для освобождения памяти. Реализация живет в JVM, единственное требование — это соответствие спецификациям JVM. Типы сборщиков мусора:
- Серийный.
- Параллельный / Пропускной.
- CMS.
- G1.
Давайте посмотрим на некоторые преимущества сборки мусора:
- Автоматически удаляет неиспользуемые объекты, которые недоступны, для освобождения памяти.
- Делает память Java эффективной.
- Это не должно быть явно вызвано, так как реализация живет в JVM.
- Важный и стандартный компонент многих языков программирования.
Сравнение с конструктором
| Конструктор | Деструктор |
|---|---|
| Используется для инициализации экземпляра класса | Используется для удаления или уничтожения объектов, когда они больше не используются |
| Вызываются при создании экземпляра класса | Вызываются, когда объект уничтожен или освобожден |
| Выделение памяти | Освобождает память |
| Возможна перегрузка | Перегрузка не допускается |
| Им разрешено иметь аргументы | Нельзя передавать аргументы |
Finalize()
Любому разработчику становится довольно сложно принудительно запустить сборщик мусора, но есть альтернатива этому. Мы можем использовать метод object.finalize(), который работает точно так же, как деструктор.
Метод наследуется во всех объектах Java. Он не является деструктором, но используется для обеспечения дополнительной безопасности при использовании внешних ресурсов, таких как закрытие файла и т. д., прежде, чем программа завершит работу. Вы можете вызвать его, используя сам метод или system.runFinalizersOnExit (true).
Использование метода finalize() настоятельно не рекомендуется, поскольку это может быть очень небезопасным, а в некоторых случаях использоваться неправильно.
Давайте рассмотрим простой пример, чтобы показать, как finalize() может использоваться для вызова сборщика мусора.
public class A {
public void finalize() throws Throwable{
System.out.println("Object is destroyed by the Garbage Collector");
}
public static void main(String[] args) {
A test = new A();
test = null;
System.gc();
}
}
