2014-09-29 1 views
0

Java 가비지 수집에 대한 몇 가지 질문이 있습니다.이 코드는 가비지 수집 할 수 있습니까?

는 아래 ChildMaker 인스턴스가 가비지 수집 될 수 있는지 궁금 일부 테스트 클래스

public class ChildMaker{ 
    public Child createChild(){ 
     Child c = new Child(); 
     return c; 
    } 
} 

의 코드 내가

public class TestChildMaker{ 
    public getChild(){ 
     ChildMaker maker = new ChildMaker(); 
     Child c = maker.createChild(); 
     .... 
    }   
} 

을 수행하고있어 실제 시험이다. 그럴 수있어?

+0

클래스 또는 개체? –

+0

@SotiriosDelimanolis : 수업을 수집하는 가비지가 의미가 없다고 생각하여 편집했습니다. – Dici

+1

@Dici (글쎄, 그건 아주 드문 일이다.) –

답변

2

자바 가비지 컬렉터는 정교하며 공정하게 자율적으로 작업하기를 좋아합니다. 쓰레기 수거를 강요 할 수 없으며, 가비지 수집시기를 알려줄 수 있습니다.

프로그램에서 참조가 여전히 유지되는 개체 (엄격히 말하면 실행 가능한 스레드)는 가비지 수집 될 수 없습니다. 다른 건 그럴 수 있습니다.

나는 Child이 여전히 참조되는 동안 ChildMaker 인스턴스가 가비지 수집 될 수 있는지 여부를 묻는 것입니다. 엄밀히 말하면 사용자가 제공 한 코드에는 그러한 위치가 존재하지 않습니다. 대답은 '예'입니다. ChildMaker이 참조되지 않으면 ChildChildMaker에 대한 참조를 보유하지 않기 때문에 Child이 여전히 참조되는 경우에도 가비지 수집 될 수 있습니다.

1

대답은 변수 maker 재사용하는 경우

public getChild(){ 
    ChildMaker maker = new ChildMaker(); 
    Child c = maker.createChild(); 
    .... // here <-------- 
}  

을 어떻게되는지에 따라 달라집니다 참조하는 개체가 도달하기 때문에 쓰레기 수집 할 수 없습니다. maker을 다시 사용하지 않으면 개체에 더 이상 연결할 수 없어 가비지 수집 될 수 있습니다.

Java Language Specification 상태

도달 가능한 객체는 모든 활성 스레드로부터 잠재적 계속 계산에 액세스 될 수있는 임의의 개체이다.