В документации для финализации говорится
Вызывается сборщиком мусора для объекта, когда сборщик мусора определяет, что на этот объект больше нет ссылок. Подкласс переопределяет метод 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
Я читал, что ОС очистит память после завершения программы, поэтому нет необходимости в сборке мусора во время работы программы.
Итак, у меня есть три вопроса,
- Будет ли вызываться
finalize
метод с объектом типа A () сборщик мусора? Если да, то почему он не был вызван сейчас, и если нет, в каких случаях он будет вызван? - Будет ли метод
finalize()
вызываться каждый раз при сборке мусора? - Если сборка мусора не происходит при запуске программы, будет ли процесс jvm запускать сборку мусора спустя долгое время после завершения программы?
ПРИМЕЧАНИЕ. В моем случае сборщик мусора вызывается, потому что new A(5)
больше не упоминается в программе.
РЕДАКТИРОВАТЬ:
Объяснение, почему этот вопрос отличается:
Этот вопрос больше о том, всегда ли будет вызываться метод finalize()
при сборке мусора и может ли сборка мусора происходить без вызова метода finalize()
.
Такой вопрос не поднимался, и если он был, ответ на такой вопрос недоступен в StackOverflow.
System.gc()
. - person Holger   schedule 05.04.2018