2014-09-15 2 views
0
public class GarbageC { 
public void finalize() 
{ 
System.out.println("Finalize method"); 
} 
public static void main(String[] args) { 
    GarbageC c1=new GarbageC(); 
    GarbageC c2=new GarbageC(); 
    c1=null; 
    c2=null; 
    System.gc(); 
    System.out.println("abc"); 
} 
} 

В то время как я отладки этот код, о/р приходит вКак работает метод gc?

Finalize method 
Finalize method 
abc 

и когда я бегу, я получаю это

abc 
Finalize method 
Finalize method 

Почему я получаю различные выходы в обоих случаи

ответ

3

Вызов System.gc() - это запрос. Среда выполнения не должна собирать мусор в ответ. Он вполне может решить игнорировать вас. Таким образом, вы не можете зависеть от этого, делая то же самое последовательно.

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

1

Если вы запустили его достаточно часто, вы можете получить любые из 3 возможных выходов.

Процесс сбора мусора, возможно, выполняется в выделенном потоке (по крайней мере, в любой последней виртуальной машине), поэтому выход зависит от скорости каждого потока (основного потока и потока GC на ВМ).

В режиме отладки основной поток значительно медленнее (вы можете приостановить его неопределенно при переходе по коду). Таким образом, GC обгоняет ваш основной поток. Когда вы просто запускаете программу; основной поток, скорее всего, пройдет до завершения, прежде чем виртуальная машина даже попытается собрать мусор.

Звонок в System.gc() - это только запрос «эй », пожалуйста, сделать gc », даже если VM почитает его (его не требуется), ваш запрос будет передан в поток GC; что предполагает по крайней мере небольшую задержку, прежде чем GC начнет работу; и еще некоторое время, пока оно фактически не обнаруживает ваши мусорные объекты, а затем, наконец, собирает их.

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