해시 맵 안에 개체가 있습니다. 이러한 객체에는 바이트 버퍼가 포함되어 있습니다. 이제 그 바이트 버퍼를 해제하고 싶습니다. 따라서 hashmap 참조를 null로 설정하면 가비지 수집 준비가 완료된 모든 객체와 버퍼를 해제 할 수 있습니다. 또는 모든 것을 명시 적으로 null로 만들 필요가 있습니다.개체를 가비지 수집하는 방법?
답변
프로그램의 아무 곳이나 참조가 없으면 가비지 수집 할 준비가 된 개체입니다. 시간이 많이 걸리는시기는 사용한 가비지 수집기에 따라 다릅니다.
근본적으로는 도달 가능성입니다. 코드에있는 항목 (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
에 도달 할 수 없음).
GC 뿌리의 개념을 언급해야합니다. 그래프에서 경로를 분석하는 것은 출발점이있는 경우에만 의미가 있습니다. – the8472
예, 다른 참조가 없다면 가비지 수집됩니다 (아마도 수동). 지도에 대한 참조 만 있으면 예, 가비지 수집됩니다.
내 생각 :
내가 전화 경우에는 myMap = NULL; 지도에서 관련된 해시 맵 키 또는 값 개체가 실제로 어떻게됩니까? 이들도 가비지 수집 될 것인가, 아니면 myMap 객체 내부의 모든 관련 객체를 null로 설정해야합니까?
myMap에는 다른 객체에서 여전히 도달 할 수있는 키와 값이 있다고 가정 해 봅시다. 다음으로,
- 아무 반응이 없습니다.
- 지도를 통해 해당 키와 값에만 접근 할 수 있으면 이제 도달 할 수 없으며 가비지 수집 대상입니다. (이 경우, 내부 객체에 대한 참조에 null을 할당 할 필요가 없습니다.)
- 그러나 내부 노드가 다른 경로를 통해 도달 할 수 있다면 여전히 도달 할 수 있으므로 가비지 수집 대상이 아닙니다. 지도를 null로 만들면 가비지 수집되지 않습니다.
일반적으로 가비지 수집을 위해 코드에서 개체를 검색 할 수있는 방법이 없습니다. 따라서 전체 요소를 해제하려면 해시 맵 참조를 null로 만드는 것으로 충분합니다. –