Будет ли работать сборщик мусора, когда не запущена никакая java-программа?

В документации для финализации говорится

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

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

public final class MainClass{


    public static void main(String[] args) {
        A s = new A(5);
        s = new A(6);
        System.out.println(s);

        System.out.println("End of main");
    }

}
final class A{

    private int value;

    public A(int value) {
        this.value = value;
    }

    @Override
    protected void finalize() throws Throwable {

        System.out.println("Destroyed object is :"+this);
        System.out.println("Inside finalize");
        super.finalize();
    }       

    @Override
    public String toString() {
        return ((Integer)value).toString();
    }
}

Вывод программы:

6
End of main

После инициализации new A(6) с помощью System.gc() запускается метод finalize, и объект со значением 5 удаляется сборщиком мусора, и вывод будет

6
Destroyed object is :5
Inside finalize
End of main

Я читал, что ОС очистит память после завершения программы, поэтому нет необходимости в сборке мусора во время работы программы.

Итак, у меня есть три вопроса,

  1. Будет ли вызываться finalize метод с объектом типа A () сборщик мусора? Если да, то почему он не был вызван сейчас, и если нет, в каких случаях он будет вызван?
  2. Будет ли метод finalize() вызываться каждый раз при сборке мусора?
  3. Если сборка мусора не происходит при запуске программы, будет ли процесс jvm запускать сборку мусора спустя долгое время после завершения программы?

ПРИМЕЧАНИЕ. В моем случае сборщик мусора вызывается, потому что new A(5) больше не упоминается в программе.


РЕДАКТИРОВАТЬ:

Объяснение, почему этот вопрос отличается:

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

Такой вопрос не поднимался, и если он был, ответ на такой вопрос недоступен в StackOverflow.



person Naveen Dennis    schedule 04.04.2018    source источник
comment
1. Да. При выходе сборка мусора бессмысленна. Вся виртуальная машина уходит. 2. Нет. Завершение работы не гарантируется во время выхода. 3. Нет. Операционная система просто возвращает память; jvm - это просто еще один процесс в операционной системе.   -  person Elliott Frisch    schedule 04.04.2018
comment
Сборка мусора и финализация - это два разных действия. Таким образом, даже если экземпляр будет собран, может пройти произвольный промежуток времени до его завершения, и вполне возможно, что JVM завершится между ними, поэтому даже если объект будет собран, нет гарантии, что он когда-либо будет завершен. Но, как уже было сказано, сбор данных произойдет только в том случае, если программа все еще работает и ей требуется больше памяти. Это может случиться, когда вы позвоните System.gc().   -  person Holger    schedule 05.04.2018