Метод Java Finalize не вызывает

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

class test123{
    test123(){
        System.out.println("Inside the constructor");

    }
}
public class finalizemerthd {

    public static void main(String args[]) {
        test123 obj1 = new test123();
        obj1 = null;
        System.gc();

    }

    protected void finalize() throws Throwable
    {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

person Ishmeet Bindra    schedule 24.06.2018    source источник
comment
Вы объявили метод finalize в классе finalizemerthd. Но у вас нет экземпляра этого класса, который нужно очистить. Вместо этого вы должны добавить его в свой класс test123. Прочтите документацию по методам, проведите небольшое исследование. Также обратите внимание, что System.gc() запрашивает только запуск GC. Это может и будет задерживать или даже игнорировать бег.   -  person Zabuzard    schedule 24.06.2018
comment
Обратите внимание, что finalize устарел, начиная с Java 9 (см. документация).   -  person Zabuzard    schedule 24.06.2018
comment
Кроме того, пожалуйста, используйте обозначение @Override для метода finalize() в следующий раз, потому что я действительно запутался!   -  person Yahya    schedule 24.06.2018
comment
Пожалуйста, придерживайтесь соглашений об именах. Имена классов в PascalCase.   -  person Zabuzard    schedule 24.06.2018


Ответы (1)


System.gc() только запрашивает сборку и не гарантирует сборку мусора.

Более того, метод finalize вызывается для класса, объект которого подвергается сборке мусора, что не соответствует вашему сценарию.

Пожалуйста, найдите обновленный код и вывод ниже:

class Test123 {
    Test123() {
        System.out.println("Inside the constructor");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

public class Finalizemerthd {
    public static void main(String args[]) {
        Test123 obj1 = new Test123();
        obj1 = null;
        System.gc();
    }
}

Вывод:

Inside the constructor
Garbage collector called
Object garbage collected : MyGenerator.Test123@11adfb87
person Aman Chhabra    schedule 24.06.2018
comment
Я хотел бы добавить, что finalize устарело, начиная с Java 9. - person Zabuzard; 24.06.2018
comment
Скорее всего, finalize() все еще не вызывается до выхода из метода main и, следовательно, JVM завершает работу. Завершение может даже быть убито в середине из-за завершения работы JVM. Это так же ненадежно, как говорится в документации. - person Holger; 26.06.2018