2012-10-26 2 views
1

을 감안할 때 :주어진 프로그램에서 가비지 수집 대상 개체를 결정하는 방법은 무엇입니까?

public class Trees { 
    Trees t; 

    public static void main(String[] args) { 
     Trees t = new Trees(); 
     Trees t2 = t.go(t); 
     t2 = null; 
     // more code here : LINE 11 
    } 

    Trees go(Trees t) { 
     Trees t1 = new Trees(); 
     Trees t2 = new Trees(); 
     t1.t = t2; 
     t2.t = t1; 
     t.t = t2; 
     return t1; 
    } 
} 

라인 (11)에 도달하면, 가비지 컬렉션을받을 수 있습니다 얼마나 많은 개체를? (주 선언) 변수 t는 여전히 "A"를 개체에 대한 참조를 가지고 있기 때문에 그들 중 누구도, 가비지 컬렉션을받을 수없고, 11 행에서

Object "a": Trees t = new Trees(); 
Object "b": Trees t1 = new Trees(); 
Object "c": Trees t2 = new Trees(); 

, 두 :

+2

당신이 얼마나을 만들 수있는 다이어그램을 그리는 예 등을 보여줍니다? –

+0

't2.t' 란 무엇입니까? 클래스'Tree'에 대한 정의를 제공하십시오. –

+1

SCJP 6 책을 사서 읽어 보시기 바랍니다. 쓰레기 수거 과정에서 나온 50 페이지가 있으며 매우 상세하고 도움이됩니다. –

답변

3

당신은 GC 대상이 개체의 수를 결정하는 방법을 요청했습니다. 이러한 질문을 해결하는 가장 쉬운 방법은 참조 (t, t1, t2, 예제에서)와 실제 객체 자체를 보여주는 다이어그램을 그리는 것입니다. 오브젝트가 참조에 연결되지 않으면 Java 코드가 오브젝트에 액세스 할 수 없기 때문에 오브젝트를 수집 할 수 있습니다.

이 링크는 어떻게

http://radio.javaranch.com/corey/2004/03/25/1080237422000.html

2

당신은 세 개의 객체를 생성 "b"와 "c"는 "a"에서 도달 할 수 있습니다.

1

코드 조각을 기반으로 컨트롤이 "줄 11"에 도달하면 어떤 개체도 GC이 될 수 없습니다.

이유 :

  • Trees t;이 필드, 따라서 지금 GCed이 될 수 없습니다.
  • go을 호출 한 후 t2는 null과 같습니다. 그러나 방법 go에서 각 t1t2은 다른 하나를 가리키며 플러스 t이 그 중 하나를 가리키고 있음을 나타냅니다. 어떤 목적 때문에 참조 체인의, GCed 수 없습니다 할 수 있도록 :

t -> t2

t2 -> t1