2012-04-06 2 views
1

I 코드의 다음 조각이 : 나는 위의 코드를 실행하면자바 가비지 컬렉션 (Garbage Collection) 및 널 (null)

List<String> list = new ArrayList<String>(); 
    // WeakReference<List> wr = new WeakReference<List>(list); 
    System.out.println(" before tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" before free memory... " + Runtime.getRuntime().freeMemory()); 
    for(int i =0; i<100; i++) 
    list.add(new String("hello")); 
    //System.gc(); 
    list = null; //forcefully end its life expectancy 
    System.out.println(" after tot memory... " + Runtime.getRuntime().totalMemory()); 
    System.out.println(" after free memory... " + Runtime.getRuntime().freeMemory()); 
    System.out.println(" after memory used ... " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())); 
    // System.out.println(" weak reference " + wr.get()); 

, 나는 가능한 메모리를 볼 수는 (내 시스템 그러나이 값이 다를 수 있음)

361064입니다

그러나 System.gc() 및 comment list = null로 위의 코드를 실행할 때 위의 테스트 케이스보다 적은 여유 메모리 (이 경우 160944)가 표시 될 수 있습니다. 두 시나리오 모두에서 개체가 메모리에서 제거됩니다. 그러나 이러한 값이 다른 이유는 무엇입니까?

+1

'new String ("hello")'는 두 개의 객체를 생성합니다. 이 constructor은 결코 사용하지 말아주세요. 보십시오'list.add ("hello")' –

+0

@ajozwik 나는 결코 '말하지 않을 것입니다. 그것을위한 유즈 케이스가있다. 그것이 존재하는 이유입니다. – EJP

답변

1

list = null; 참조를 무효화하면 자동으로 가비지 수집됩니다. 이 줄을 주석 처리 할 때 참조 목록이 여전히 활성화되어 있으면 System.gc()으로 호출해도 가비지 수집되지 않습니다.

gc()을 명시 적으로 호출하면 이미 무효화되었거나 범위를 벗어난 참조가 가비지 수집됩니다.

+0

이 경우 System.gc()의 사용법은 무엇입니까? 어떤 시나리오에서 실제로 사용할 수 있습니다 :) 또한 list = null 주석이 달린 응용 프로그램을 실행하면 어떤 시스템이 해제 되었기 때문에 System.gc() 호출이 수행합니다. – UVM

+0

@UNNI gc()는 무효화되거나 범위를 벗어났습니다. 활성화 된 참조를 지우지 않습니다. –

+0

위 테스트 케이스에서 System.gc() 만 실행하면 일부 메모리 또는 일부 "값"이 해제됩니다.이 경우 목록이 아직 활성 상태이므로 그 값은 해제되며 gced되지 않습니다. – UVM

0

GC는 프로그램에서 objects which are no longer being referenced을 찾기 위해 메모리의 모든 개체를 조사하여 작동합니다. 이러한 사용되지 않는 객체는 새로운 메모리 객체를위한 공간을 만들기 위해 삭제 될 수 있습니다.

따라서 개체가 여전히 참조되고있는 경우 System.gc()을 호출해도 가비지 수집 할 수 없습니다. 코드에서 참조 할 수 있다면 객체를 어떻게 가비지 수집 할 수 있습니까?

을 호출하면 list 변수에 의해 참조 된 개체를 다시 참조 할 수 없으므로 가비지 수집 대상이됩니다.