Когда метод finalize () вызывается в Java? - PullRequest
304 голосов
/ 24 марта 2010

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

Ответы [ 16 ]

2 голосов
/ 09 апреля 2013

Объект получает право на сборку мусора или сборщик мусора, если он недоступен для каких-либо активных потоков или статических ссылок, другими словами, вы можете сказать, что объект получает право на сборку мусора, если все его ссылки равны нулю. Циклические зависимости не считаются ссылками, поэтому, если объект A имеет ссылку на объект B, а объект B имеет ссылку на объект A, и у них нет другой действующей ссылки, тогда и объекты A, и B будут иметь право на сборку мусора. Обычно объект получает право на сборку мусора в Java в следующих случаях:

  1. Все ссылки на этот объект явно установлены на нуль, например, object = null
  2. Объект создается внутри блока, и ссылка выходит из области действия после выхода из этого блока.
  3. Родительскому объекту присваивается значение NULL, если объект содержит ссылку на другой объект и когда вы устанавливаете нулевую ссылку на объект контейнера, дочерний или содержащийся объект автоматически становится пригодным для сборки мусора.
  4. Если объект имеет только живые ссылки через WeakHashMap, он будет иметь право на сборку мусора.
2 голосов
/ 24 марта 2010

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

1 голос
/ 01 февраля 2016

Класс, в котором мы переопределяем метод финализации

public class TestClass {    
    public TestClass() {
        System.out.println("constructor");
    }

    public void display() {
        System.out.println("display");
    }
    @Override
    public void finalize() {
        System.out.println("destructor");
    }
}

Вероятность вызова метода финализации

public class TestGarbageCollection {
    public static void main(String[] args) {
        while (true) {
            TestClass s = new TestClass();
            s.display();
            System.gc();
        }
    }
}

когда память перегружена объектами дампа, gc вызовет метод finalize

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

0 голосов
/ 17 апреля 2018

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

Пример:

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

0 голосов
/ 17 января 2017

Попробуйте запустить эту Программу для лучшего понимания

public class FinalizeTest 
{       
    static {
        System.out.println(Runtime.getRuntime().freeMemory());
    }

    public void run() {
        System.out.println("run");
        System.out.println(Runtime.getRuntime().freeMemory());
    }

     protected void finalize() throws Throwable { 
         System.out.println("finalize");
         while(true)
             break;          
     }

     public static void main(String[] args) {
            for (int i = 0 ; i < 500000 ; i++ ) {
                    new FinalizeTest().run();
            }
     }
}
0 голосов
/ 25 июля 2016

Java позволяет объектам реализовывать метод, называемый finalize () это может быть вызвано.

Метод finalize () вызывается, если сборщик мусора пытается собрать объект.

Если сборщик мусора не запускается, метод не вызывается.

Если сборщик мусора не может собрать объект и пытается запустить опять же, метод не вызывается во второй раз.

На практике вы вряд ли будете использовать его в реальных проектах.

Просто имейте в виду, что он не может быть вызван и что он определенно не будет вызван дважды Метод finalize () может запускать ноль или единицу время.

В следующем коде метод finalize () не производит вывод, когда мы запустите его, так как программа завершает работу до того, как возникнет необходимость сборщик мусора.

Источник

...