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"); 
} 
} 

이 코드를 디버깅 해요 반면, O/p는gc 방법은 어떻게 작동합니까?

Finalize method 
Finalize method 
abc 

로오고 내가 실행할 때,이

abc 
Finalize method 
Finalize method 

은 왜 모두에서 서로 다른 출력을 얻고 얻을 사례

답변

3

System.gc()으로 전화를하십시오. 런타임은 응답으로 수집 쓰레기를 할 필요가 없습니다. 너를 무시하기에 충분할 것이다. 따라서 일관되게 같은 일을하는 것에 의존 할 수는 없습니다.

디버그 모드에서는 가비지 수집이 실제로 실행됩니다. 비 디버깅 모드에서는 쓰레기를 모으지 않거나 그렇게 할 적절한 순간까지 기다립니다.

1

자주 실행하면 세 가지 출력 중을 얻을 수 있습니다.

가비지 수집 프로세스는 전용 스레드 (적어도 최근의 VM에서는 가능)에서 실행될 수 있으므로 출력은 각 스레드 (주 스레드 및 VM의 GC 스레드)의 속도에 따라 달라집니다.

디버그 모드에서 주 스레드는 상당히 느립니다 (코드를 단계별로 실행할 때 일시 중지 할 수 있음). 따라서 GC가 주 스레드를 따라 잡습니다. 단순히 프로그램을 실행하면; VM이 가비지 수집을 시도하기 전에 메인 스레드가 완료 될 때까지 계속 실행됩니다.

System.gc()를 호출하면 "hey please please a gc"입니다. VM이 그것을 준수하더라도 (필수 사항은 아님) 요청이 GC 스레드로 전달됩니다. GC가 실제로 작업을 시작하기 전에 최소한 약간의 지연이 필요합니다. 실제로는 더 이상 가비지 오브젝트를 발견하고 마침내 수집합니다.

관련 문제