Когда является завершение () методом, названным в Java?

Я должен знать когда finalize() метод призван JVM. Я создал тестовый класс, который пишет в файл когда finalize() метод называют путем переопределения его. Это не выполняется. Кто-либо может сказать мне причину, почему она не выполняется?

317
задан Chris Martin 12 November 2018 в 17:42
поделиться

6 ответов

В общем, лучше не полагаться на finalize () для очистки и т. Д.

Согласно Javadoc (который стоит прочитать), это:

Вызывается сборщиком мусора для объекта, когда сборщик мусора определяет, что на этот объект больше нет ссылок.

Как указал Иоахим, этого может никогда не случиться в жизни программы, если объект всегда доступен.

Также не гарантируется, что сборщик мусора будет работать в определенное время. В общем, я пытаюсь сказать, что finalize () , вероятно, не лучший метод для использования в целом, если нет чего-то конкретного, для чего он вам нужен.

267
ответ дан 23 November 2019 в 01:02
поделиться
 protected void finalize () выбрасывает Throwable {} 
 
  • каждый класс наследует метод finalize () от метода java.lang.Object
  • вызывается сборщиком мусора, когда он определяет, что больше нет ссылок на объект
  • . Метод завершения объекта не выполняет никаких действий, но может быть отменен любым классом
  • обычно его следует переопределить, чтобы очистить ресурсы, не относящиеся к Java, т.е. закрыть файл
  • , если переопределить finalize () , хорошей практикой программирования является использование {{1} } try-catch-finally и всегда вызывать super.finalize () . Этот является мерой безопасности, чтобы убедиться, что вы случайно не пропустите закрытие ресурса , используемого объектами, вызывающими class

     protected void finalize () throws Бросок {
    try {
    close (); // закрываем открытые файлы 
    } наконец {
    super.finalize (); 
    } 
    } 
     
  • любое исключение, вызванное finalize () во время сборки мусора останавливает финализацию , но в противном случае игнорируется

  • finalize () никогда не запускается более одного раза для любого объекта

, цитируемого из: http : //www.janeg.ca/scjp/gc/finalize.html

Вы также можете проверить эту статью:

71
ответ дан 23 November 2019 в 01:02
поделиться

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

Обратите внимание, что вполне возможно, что объект никогда не получает сборщик мусора (и поэтому finalize никогда не вызывается). Это может произойти, когда объект никогда не становится подходящим для gc (потому что он доступен в течение всего времени существования JVM) или когда сборка мусора фактически не выполняется между моментом, когда объект становится подходящим, и временем, когда JVM перестает работать (это часто происходит с простым тестовые программы).

Есть способы указать JVM запустить finalize для объектов, которые еще не вызывались, но их использование тоже не очень хорошая идея (гарантии этого метода не очень сильный тоже).

Если вы полагаетесь на finalize для правильной работы вашего приложения, значит, вы делаете что-то неправильно. finalize следует использовать только для очистки ресурсов (обычно не связанных с Java). И это в точности , потому что JVM не гарантирует, что finalize когда-либо будет вызван для любого объекта.

369
ответ дан 23 November 2019 в 01:02
поделиться

finalize метод не гарантируется. Этот метод вызывается, когда объект становится подходящим для GC. Есть много ситуаций, когда объекты не могут быть обработаны сборщиком мусора.

2
ответ дан 23 November 2019 в 01:02
поделиться

Java finalize () не является деструктором и не должен использоваться для обработки логики, от которой зависит ваше приложение. В спецификации Java говорится, что нет никакой гарантии, что метод finalize будет вызван вообще во время работы приложения.

Вероятно, вам нужна комбинация finally и метода очистки, например:

MyClass myObj;

try {
    myObj = new MyClass();

    // ...
} finally {

    if (null != myObj) {
        myObj.cleanup();
    }
}
25
ответ дан 23 November 2019 в 01:02
поделиться

Когда в Java вызывается метод finalize () ?

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

  • Если объект никогда не становится недоступным, для него никогда не будет вызвана функция finalize () .

  • Если GC не запускается, то finalize () может никогда не вызываться. (Обычно сборщик мусора запускается только тогда, когда JVM решает, что существует достаточно мусора, чтобы сделать его стоящим.)

  • Может пройти более одного цикла сборщика мусора, прежде чем сборщик мусора определит, что конкретный объект недоступен. (Сборщики мусора Java обычно являются сборщиками «поколений» ...)

  • Как только сборщик мусора обнаруживает, что объект недоступен и может быть завершен, он помещается в очередь завершения. Завершение обычно происходит асинхронно с обычным сборщиком мусора.

(Спецификация JVM на самом деле позволяет JVM никогда не запускать финализаторы ... при условии, что это не освобождает пространство, используемое объектами. JVM, которая была реализована таким образом было бы парализовано / бесполезно, но если такое поведение «разрешено».)

В результате неразумно полагаться на финализацию для выполнения действий, которые должны быть выполнены в определенные временные рамки. Лучше всего их вообще не использовать. Должен быть лучший (т.е. более надежный) способ делать то, что вы пытаетесь сделать, в методе finalize () .

Единственное законное использование для завершения - это очистка ресурсов, связанных с объектами, которые были потеряны из-за кода приложения. Даже в этом случае вы должны попытаться написать код приложения, чтобы он не терял объекты. (Например, используйте Java 7+ try-with-resources , чтобы гарантировать, что close () всегда вызывается ...)


Я создал тестовый класс, который записывает в файл, когда метод finalize () вызывается путем его переопределения. Не выполняется. Кто-нибудь может сказать мне причину, по которой он не выполняется?

Трудно сказать, но есть несколько возможностей:

  • Объект не собирается сборщиком мусора, потому что он все еще доступен.
  • Объект не собирается сборщиком мусора, потому что сборщик мусора не запускается до завершения теста.
  • Объект находит сборщик мусора и помещает сборщик мусора в очередь финализации, но финализация не завершается до завершения вашего теста.
16
ответ дан 23 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: