2011-05-02 2 views
3

기본적으로 저는 Java에 상당히 익숙하지 않습니다. 그리고 다음과 같은 저의 머리를 쓰려고 노력하고 있습니다.범위를 벗어 났지만 여전히 참조를 보유하고있을 때 Java GC에 어떤 현상이 있습니까?

public class Test { 

TestObject objectA; 

public static void main(String args[]) 
{ 
    Test t = new Test(); 
    t.test(); 
    while (true){ 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) {} 
     System.out.println("Obj A: " + t.objectA.toString()); 
    } 
} 

void test(){ 
    Object objectB = new TestObject(1, 1); 

    objectA = (TestObject)objectB; 
    System.out.println("Obj B: " + objectB); 

    objectB = null;  System.out.println("Obj B: " + objectB); 
} 

}

출력 :

Obj B: [email protected] 

Obj B: null 

Obj A: [email protected] 

Obj A: [email protected] 

기본적 난 (방법] 시험에서 로컬 객체 objectB를 생성)하고 피 검체 내부 변수 objectA 참조의 할당하고있다.

그런 다음 로컬 변수를 null로 설정하고 참조가 null인지 확인합니다.

여기 내 이해에서부터 효과적으로 개체에 대한 포인터를 nulled했습니다. 개체는 유일한 참조를 포함하는 objectA와 함께 계속 존재합니다. 이것은 가비지 콜렉터가 범위가 좁은 메소드에서 작성된 오브젝트를 수집하지 않는다는 것을 의미합니까?

objectA에 대한 포인터를 null로 설정하면 객체가 수집됩니까?

죄송합니다.이 답변이 분명한 질문 인 것 같으면 이미 읽은 내용을 이해하고 있어야합니다.

답변

5

예, objectA을 개체로 지정하면 개체가 수집되지 않습니다. 그리고 네, 마지막 남은 참조를 제거하면 개체를 수집 할 수 있습니다.

"수집 중"대신 "수집 대상"으로 지정하는 것이 중요합니다. 즉, JVM이 메모리를 다시 필요로하지 않는다면 즉시 개체가 수집되지 않을 수도 있습니다.

+0

저를 위해 그것을 지우는 환호. –

1

예. 참조가없는 경우 개체가 가비지 수집 대상입니다. 예를 들어

:이 코드에 대한 참조에서 액세스 할 수 없습니다 더 정확하게 경우 (3 개체 중 하나를 액세스 할 수있는 코드에서 서로하지만 참조 변수를 참조의 예)

A -> B

B -> C

C ->를

하지만 A, B 및 C에 대한 참조 => 셋 모두 GC에 적합하다.

관련 문제