해시 맵 안에 개체가 있습니다. 이러한 객체에는 바이트 버퍼가 포함되어 있습니다. 이제 그 바이트 버퍼를 해제하고 싶습니다. 따라서 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로 만들면 가비지 수집되지 않습니다.
- 1. Java에서 객체를 가비지 수집하는 방법
- 2. Java에서 정적 변수를 수집하는 가비지
- 3. 명시 적으로 가비지 수집 할 개체를 만드는 방법
- 4. 가비지 수집을 위해 개체를 추적하는 방법
- 5. C# Linq의 배열을 기반으로 수집하는 개체를 필터링하거나 쿼리하는 방법
- 6. CopyOnWriteArrayList에 스트림을 수집하는 방법
- 7. 미로에서 결과를 수집하는 방법
- 8. 공포를 수집하는 방법! 논의?
- 9. 데이터베이스없이 데이터를 수집하는 방법
- 10. 가비지 수집기가이 경우 내 개체를 파괴합니까?
- 11. 가비지 수집기가 인터페이스 작성기에서 개체를 삭제합니다.
- 12. 하나의 활동으로 ArrayList를 수집하는 방법
- 13. Reducers가 Hadoop에서지도 출력을 수집하는 방법
- 14. 대화 상자 값을 수집하는 방법
- 15. Grails : 모든 메시지를 수집하는 방법
- 16. 조각에서 가치/데이터를 수집하는 방법
- 17. Perl에서 "iperf"출력을 수집하는 방법
- 18. 가비지 수집을 외부에서 수행하는 방법
- 19. 세대 별 가비지 수집과 .NET의 가비지 수집
- 20. 목록에있는 모든 개체를 만드는 방법
- 21. 매개 변수로 가비지 수집 객체가 가비지 수집으로 전달 되었습니까? 나는 새로운 개체를 만드는 경우
- 22. 가비지 컬렉션 개체를 제거해야하지만 WeakReference.IsAlive은 여전히 반환 사실
- 23. 주어진 프로그램에서 가비지 수집 대상 개체를 결정하는 방법은 무엇입니까?
- 24. 목록에서 가비지 수집 대상 개체를 만드는 방법은 무엇입니까?
- 25. 세대 가비지 수집기의 모든 개체를 찾을 수 있습니까?
- 26. 다중 처리 프로세스에서 가비지 수집기에서 로깅 개체를 보호하려면 어떻게해야합니까?
- 27. 가비지 수집 될 특정 자바 스크립트 개체를 확인하려면 어떻게해야합니까?
- 28. Visual Basic 가비지 수집
- 29. 개체를 만드는 방법 다른 개체를 만드는 방법
- 30. JavaFX 탭을 가비지 수집기에서 수집해야합니까?
일반적으로 가비지 수집을 위해 코드에서 개체를 검색 할 수있는 방법이 없습니다. 따라서 전체 요소를 해제하려면 해시 맵 참조를 null로 만드는 것으로 충분합니다. –