2014-12-16 3 views
3

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

package temp; 

public class Temp { 

    int i; 

    Temp(int j) { 
     i = j; 
    } 

    public void finalize() { 
     if (i == 10) { 
      System.out.println("Finalize called."); 
     } 
    } 

    public static void main(String[] args) { 
     Temp obj = new Temp(10); 
     System.gc(); 
    } 

} 
+0

см это: http://stackoverflow.com/questions/2506488/when-is-the-finalize-method-called-in-java –

+1

никакой гарантии на самом деле выполнить сбор мусора – Raghu

ответ

6

Ваш призыв к System.gc(); не имеет никакого значения, так как ваш Temp экземпляр имеет ссылку (obj), так что это не имеет права для сбора мусора.

Даже если это имело право на сбор мусора, вызов System.gc(); не обязательно собирает все объекты, которые не имеют ссылки на них немедленно.

+3

Кроме того, сбор мусора не не гарантируется даже после вызова System.gc(). Таким образом, финализация может не вызываться. – Sid

+1

действительно нет гарантии. System.gc() просто ** предлагает ** запустить сборку мусора. – Secondo

1

добавить obj = null;, чтобы сделать ссылку нулевой, тогда будет вызываться метод finalize. Thsi снова не является гарантированным поведением, для меня 1-2 раза я мог его вызывать из 5 раз.

public static void main(String[] args) { 
     Temp obj = new Temp(10); 
     obj = null; 
     System.gc(); 
    } 

Выход

hi10 
Finalize called. 
+2

Чтобы повторить то, что я упомянул в другом комментарии, System.gc() не гарантирует сбор мусора. Речь идет о решении времени исполнения. В этом случае он срабатывает, в какой-то другой момент это может и не быть. Таким образом, это не является верным способом вызова finalize. – Sid

+0

Как указано: никаких гарантий для этого – reto

+0

@reto да, это была всего лишь одна возможность сделать ссылку нулевой, но да еще не гарантирована. :) –

2

Это случиться так, что им чтение Effective Java

ПУНКТ 7: ИЗБЕЖАТЬ Финализаторы

Финализаторы непредсказуемы, часто опасно, и в целом не нужно. -Эффективная Java (страница 50)

другой из pdf.

Не соблазняйте методами System.gc и System.runFinalization. Они могут увеличить шансы финализаторов, выполненных, но они не гарантируют его. Единственными методами, которые утверждают, что окончательная доработка - это System.runFi- nalizersOnExit и его злой близнец, Runtime.runFinalizersOnExit. Эти методы являются смертельно ошибочными и устарели [ThreadStop].

на основе этого с использованием System.gc только увеличит шансы финализаторами получения казнены и, что важно использовать его не будет гарантировать, что он будет работать Garbage Collection, это только предлагая к JVM.

другой один.

Спецификация языка не только не гарантирует, что финальные команды будут выполнены незамедлительно; он не гарантирует, что они будут выполнены в ГЛАВЕ 2 СОЗДАНИЯ И УНИЧТОЖЕНИЯ ОБЪЕКТОВ 28 все. Вполне возможно, даже вероятно, что программа завершается без выполнения финализаторов на некоторых объектах, которые больше не являются достижимы

0

при создании объекта конструктора вызывается, но не ФИНАЛИЗ() метода, так что вам нужно обратитесь к функции из экземпляра obj и здесь System.дс(); не имеет никакого значения или называется методом finalize();

Смежные вопросы