2016-08-08 3 views
0

해시 맵 안에 개체가 있습니다. 이러한 객체에는 바이트 버퍼가 포함되어 있습니다. 이제 그 바이트 버퍼를 해제하고 싶습니다. 따라서 hashmap 참조를 null로 설정하면 가비지 수집 준비가 완료된 모든 객체와 버퍼를 해제 할 수 있습니다. 또는 모든 것을 명시 적으로 null로 만들 필요가 있습니다.개체를 가비지 수집하는 방법?

+0

일반적으로 가비지 수집을 위해 코드에서 개체를 검색 할 수있는 방법이 없습니다. 따라서 전체 요소를 해제하려면 해시 맵 참조를 null로 만드는 것으로 충분합니다. –

답변

0

프로그램의 아무 곳이나 참조가 없으면 가비지 수집 할 준비가 된 개체입니다. 시간이 많이 걸리는시기는 사용한 가비지 수집기에 따라 다릅니다.

1

근본적으로는 도달 가능성입니다. 코드에있는 항목 (a가있는 a -> b -> c)부터 시작하여 참조 (normal)의 참조를 통해 객체에 접근 할 수없는 경우 GC를 사용할 수 있습니다. 할 수 있다면, 그렇지 않습니다. 더 이상 아무 것도 객체를 참조하지 않으면 바이트 버퍼에 도달 할 수 없기 때문에 바이트 버퍼가 GC에 적합합니다.

해시 맵 내에 일부 개체가 있습니다.

저는이 값이 키가 아니라 값이라고 가정하겠습니다. (당신이 HashMap에서 해당 항목을 제거하거나 null에 키 값을 설정 여부의 관점에서이 문제 만.) 그에 대한 그래서

난 그냥 모든 객체를 가능하게 할 것이다 해시 맵 참조 널 (null)을 할 경우 수집 된 가비지 및 버퍼의 준비가 해제됩니다. 또는 모든 것을 명시 적으로 null로 만들 필요가 있습니다.

당신은, 예를 들어, 개체를 해제 완전히 HashMap에서 항목을 제거하거나 개체에 HashMap의 참조를 해제 할, null에 항목의 값을 설정해야합니다. 이것이 객체에 대한 유일한 참조 인 경우 객체는 GC에 적합합니다. 만약 당신의 객체가 bytebuffer를 참조하는 유일한 객체라면, 그것은 또한 GC에 적합하게됩니다. 객체의 바이트 버퍼에 대한 참조를 명시 적으로 해제 할 필요는 없습니다.

코드 그래서 1024 개 단어를 가치가있다 : 다른 곳에서

class Thingy { 
    private byte[] buffer; 

    MyObject() { 
     this.buffer = new byte[1024]; 
    } 
} 

:

Map<String, Thingy> m = new HashMap<>(); 

m.put("foo", new Thingy()); 
// At this point, the HashMap refers to the Thingy, and the Thingy refers to the 
// buffer, so neither of them is eligible for GC 

m.remove("foo"); // or m.put("foo", null) if that's really appropriate 
// At this point, nothing refers to the Thingy anymore, and so both the Thingy and 
// its buffer are eligible for GC 

1 자바는이 규칙에 대한 예외 weak references의 개념을 가지고 있습니다. 객체를 포함하는 WeakReference에서 객체를 검색 할 수있는 경우에도 해당 객체를 GC 할 수 있습니다 (어느 시점에서 더 이상 WeakReference에 도달 할 수 없음).

+0

GC 뿌리의 개념을 언급해야합니다. 그래프에서 경로를 분석하는 것은 출발점이있는 경우에만 의미가 있습니다. – the8472

0

예, 다른 참조가 없다면 가비지 수집됩니다 (아마도 수동). 지도에 대한 참조 만 있으면 예, 가비지 수집됩니다.

내 생각 :

내가 전화 경우에는 myMap = NULL; 지도에서 관련된 해시 맵 키 또는 값 개체가 실제로 어떻게됩니까? 이들도 가비지 수집 될 것인가, 아니면 myMap 객체 내부의 모든 관련 객체를 null로 설정해야합니까?

myMap에는 다른 객체에서 여전히 도달 할 수있는 키와 값이 있다고 가정 해 봅시다. 다음으로,

  • 아무 반응이 없습니다.
  • 지도를 통해 해당 키와 값에만 접근 할 수 있으면 이제 도달 할 수 없으며 가비지 수집 대상입니다. (이 경우, 내부 객체에 대한 참조에 null을 할당 할 필요가 없습니다.)
  • 그러나 내부 노드가 다른 경로를 통해 도달 할 수 있다면 여전히 도달 할 수 있으므로 가비지 수집 대상이 아닙니다. 지도를 null로 만들면 가비지 수집되지 않습니다.
관련 문제