Почему финализация требуется, когда GC может освободить все соединения - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть объект.Он открыл FileConnection.
Теперь я сделал ссылку на объект null.
Затем GC [ G arbage- C ollecter] запускается.
Итак, GC освободит объект, а также закроет FileConnection, удерживаемый объектом.

Тогда зачем мне переопределять метод финализации?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вам не нужно переопределять метод finalize.А еще лучше вообще забыть о методе finalize, он устарел.

Но вам нужно закрыть ресурс, как только вы покончили с ним.GC может хранить неиспользуемые предметы в течение очень долгого времени.Если вы полагаетесь на закрытие системных ресурсов GC, у вас могут не хватить таких вещей, как дескрипторы файлов, блокировки или сокеты на уровне ОС.Это ограниченные ресурсы.

0 голосов
/ 21 декабря 2018

finalize() вызывается GC как раз перед тем, как уничтожить объект.Это никогда не может произойти вообще, и метод finalize() никогда не будет вызван.

Если вы берете ресурс (то есть открываете файл), вы должны правильно вручную освободить его.Вы можете использовать AutoCloseable интерфейс.

Пример:

try (Scanner scan = new Scanner(new File("xxx"))) {
   // do smth.
} // scan.close() will be automatically called here

или более строго:

Scanner scan = null;

try {
    scan = new Scanner(new File("xxx"));
} finally {
    if (scan != null)
        scan.close();  // instead of scan.finalize();
}

PS Никогда не использовать finalize()Метод - это устаревший и используемый в очень специфических решениях низкого уровня.Если вы задаете этот вопрос, значит, это не ваш вопрос.

...