2013-06-13 2 views
2

게임 개체의 HashMap이 있습니다. 각 Game 객체에는 HashMap of Players와 Moves 목록이 있습니다. 게임이 끝나면 맵에서 제거하고 싶습니다. 게임 개체를 제거하기 전에 플레이어를 비우고 목록을 이동시켜야합니까? 아니면 GC가 처리할까요?) 당신은 아무것도 할 필요가 없습니다자바 가비지 콜렉션 문제

답변

3

게임 개체에서 Players HashMap을 참조하고 게임이 끝나고지도에서 제거하는 경우 플레이어 맵은 게임에서 참조 되었기 때문에 제거됩니다. 게임에 대한 참조가 다음 손실되면, 그들은 외부 게임 오브젝트

에서 참조 할 경우 게임에서 언급 된 모든 오브젝트도 손실됩니다 그럼 우리가 예를 사용하여이 이해 할 수

.

  • 우리는 문 클래스와 문이있을 것이다 방 클래스
  • 방을 가지고 있고 그것은 방 없이는 존재할 수 없습니다.

Room 객체가 생성 될 것입니다, 우리는 Room room = new Room()을 쓸 때 우리가이 코드 여기

public class Room { 
Door door = new Door(); 
    public static void main(String[] args) { 
     Room room = new Room(); 
     room = null; 
    } 

} 

를 보자, 그리고 Door 그것을 위해 인스턴스 변수이기 때문에하는 door도 만들어집니다. doorroom.door을 사용하는 방에서 참조됩니다. 현재 room에 액세스 할 수 있으며 door에 방을 통해 액세스 할 수 있습니다. 따라서 door 개체는 room을 통해 참조를 갖습니다.

이제 room = null을 실행하면 Room 개체에 대한 참조가 손실됩니다. Door 개체는 Room을 통해서만 참조되므로이 참조가 손실되었습니다. room = null으로 room.door에 액세스 할 수 없습니다. Room room = new Room(); 실행 될때 첫번째 이미지는 상태를 도시

enter image description here

다음과 같이

는 개략적으로 지칭된다. 문에 대한 참조가 있습니다.

두 번째 이미지는 room = null 이후의 상태를 나타냅니다. 점선은 참조가 유실되었음을 나타냅니다. 이제 Room에 대한 참조가 손실되고 분명히 door에 대한 참조도 손실됩니다. 이 시점에서

...두 개체 모두 가비지 수집 대상이됩니다.

+0

당신의 노력에 감사합니다 :) – ducin

+0

내 기쁨 ... 도와 드리겠습니다. –

10

,

그래, 그는 죄송 초보자 질문이 있습니다.

전체 개체 그래프가 루트가있는 개체로 참조되지 않는 한 GC는 모든 것을 자동으로 수집합니다.

뿌리 개체는 수집 할 수 없도록 보장되는 개체입니다. – 정적 필드 또는 모든 스레드의 활성 스택 프레임에 의해 참조되는 개체입니다.

+0

'루트 개체'란 무엇입니까? 나는 GC가 어딘가에 여전히 참조가있는 것을 만지지는 않을 것이라는 것을 알고있다. 그래서 당신은 단순히 다른 참조가 있다는 것을 의미 하는가? – ducin

+0

@tkoomzaaskz : 참조하는 것이 자체로 수집 가능한 경우 둘 다 수집됩니다. 내 편집을 참조하십시오. – SLaks

+0

"뿌리 박은"상태의 좋은 묘사가 확실하지 않습니다. 모든 스레드에서 더 이상 액세스 할 수없는 객체는 가비지 수집 대상입니다. 이러한 오브젝트가 액세스 할 수없는 다른 오브젝트를 참조하면 전체 오브젝트 그래프가 적합합니다. 이러한 객체 그래프는 "Isolation of Islands"라고 불립니다. – Brabster