Java - Объекты не "мусор" в конце программы? - PullRequest
1 голос
/ 26 февраля 2011
public class Main {

    public static void main(String[] args) throws InterruptedException {
        ClassA a = new ClassA();
        a = null;

        //Runtime.getRuntime().gc();
        Thread.sleep(4000);
    }
}

public class ClassA {

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

С приведенным выше кодом finalize () никогда не выполняется.Ничего не выводится на консоль.При удалении комментария из gc () выполняется finalize (), и «очищенный» выводится на консоль.Почему я должен явно вызывать сборщик мусора?

1 Ответ

16 голосов
/ 26 февраля 2011

Завершение не гарантируется при выходе из виртуальной машины.Для GC нет явного GC, и финализация выполняется в специальном потоке, который также завершается.Ссылка на объяснение: http://download.oracle.com/javase/6/docs/api/java/lang/System.html#runFinalizersOnExit%28boolean%29

Если вам нужно очистить код, используйте:
Runtime.addShutdownHook http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

...