Вопросы для собеседования по 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 и подпишитесь на бесплатную рассылку новостей!

Похожие записи

Добавить комментарий

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