2010-04-19 4 views
1

난 다음 코드 스냅 샷이 : 자바 메모리 관리

public void getResults(String expression, String collection){ 
ReferenceList list; 
Vector <ReferenceList> lists = new <ReferenceList> Vector(); 

list = invertedIndex.get(1)//invertedIndex is class member 

lists.add(list); 
} 

이 방법이 완료되면, 내가 로컬 개체 (목록리스트) "파괴"하는 것을 supose을. invertedIndex에 저장된 목록에 의해 점유 된 메모리가 또한 해제되었는지 알 수 있습니까? 또는 자바가 list = invertedIndex.get (1);을 할당 할 때 새로운 메모리를 할당합니다.

+0

Vector는 더 이상 사용되어야하는 구식 데이터 구조입니다. –

답변

1

예, 메서드가 반환 된 후 lists은 가비지 수집으로 표시됩니다. get 작업이 파괴되지 않는

listinvertedIndex은 (IE는, 그 자체에서 list를 제거하고 리턴), 영향을받지 않습니다.

+0

실제로 목록에 메모리를 할당하지 않기 때문에 목록 만 가비지 수집으로 표시됩니다. 내가 맞습니까? – pavlos

+0

예, 좋은 지적입니다. 'list' 변수 자체가 사용하는 메모리 만 회수되며'list'가 가리키는 실제 객체가 사용하는 메모리는 아닙니다. –

2

listlists은 메모리 관리를 수행 할 때 개체 자체가 아니라 개체에 대한 참조로 생각하십시오.

메서드가 호출되기 전에 invertedIndex 개체에 마킹이 있습니다. 메모리에 남아있는 클래스에서 참조되므로 해당 객체를 가비지 수집에 사용할 수 없습니다.

이 메서드에서는 벡터를 만들고이를 참조하기 위해 lists을 사용합니다. invertedIndex 안에있는 객체의 일부의 이름을 list으로 지정합니다.

메서드가 호출 된 후 두 이름이 범위를 벗어납니다. 생성 된 벡터에는 다른 참조가 없으므로 가비지 수집에 사용할 수 있습니다. 그러나 list이 참조하는 개체는 여전히 invertedIndex에 의해 간접적으로 참조되므로 가비지 수집에 사용할 수 없습니다.

이 정보가 도움이되기를 바랍니다.

+0

감사합니다. 정말 도움이되었습니다. – pavlos