Вопросы для собеседования по Java (серия) — метод `finalize`
Остерегайтесь F-слова! 😈
Краткий
Различие между тремя F-словами Java в наши дни является одним из излюбленных слов интервьюеров.
в предыдущий пост мы покрыли finally
ключевое слово.
🚀 Сегодня мы поговорим о finalize
метод.
Ознакомьтесь с другими подобными сообщениями на сайте new-spike.net и подпишитесь на бесплатную рассылку новостей!
Реализация
finalize
метод находится на Object
учебный класс. Это означает, что каждый созданный класс имеет к нему доступ.
Он пуст, поэтому его можно настроить в зависимости от ваших конкретных случаев.
public class Object {
. . .
protected void finalize() throws Throwable { }
}
Чтобы понять, как это работает и как используется, нам нужно сделать шаг назад и поговорить о том, как Уборщик мусора работает на Яве.
Уборщик мусора
Этот компонент просматривает память кучи (где все объекты хранятся в JVM), чтобы найти объекты, на которые нет ссылок.
🔵 Примеры объектов без ссылок
Car car = new Car(); // create a new Car object
car = null;
Car car1 = new Car(); // create a new Car object
Car car2 = new Car(); // create a second Car object
car1 = car2; // the first instance is not referenced anymore
Ознакомьтесь с другими подобными сообщениями на сайте new-spike.net и подпишитесь на бесплатную рассылку новостей!
Найденные будут уничтожены и удалены из памяти в процессе, называемом автоматическое управление памятью. Как следует из названия, это делается автоматически, поэтому нет необходимости делать это явно, как в других языках программирования, таких как C++.
Перед уничтожением объекта JVM проверяет, не использует ли он ресурсы, которые должны быть освобождены. Этими ресурсами могут быть:
🔹 подключения к базе данных
🔹 сетевые подключения
🔹 файловые ресурсы и т. д.
Эти ресурсы закрываются, когда сборщик мусора вызывает finalize()
на удаляемом объекте.
🔵 Явная сборка мусора
Вы также можете вызвать его явно.
public class Car {
public Car() {
System.out.println("Car object created");
}
@Override
protected void finalize() {
System.out.println("Finalize method called");
}
}
public class FinalizeService {
public void finalizeObject() {
Car car = new Car();
car = null; // unreference object
System.gc(); // call the Garbage Collector
}
}
🔸 Вывод:
Car object created
Finalize method called
Подводные камни
По большей части вы не должны вмешиваться в процесс сборки мусора.
Вот несколько причин:
🔹 Выполнение System.gc()
не запускает процесс GC немедленно. Реализация JVM и системные ресурсы влияют на время запуска.
🔹 Поскольку процесс GC зависит от JVM, одно и то же приложение может хорошо работать в одной системе и хуже работать в другой.
🔹 Если возникает исключение из finalize
метод, процесс GC останавливается и может оставить удаляемый объект в измененном состоянии.
🔹 И последнее, finalize
метод устарел, начиная с Java 9, и в конечном итоге будет удален.
Ознакомьтесь с другими подобными сообщениями на сайте new-spike.net и подпишитесь на бесплатную рассылку новостей!