2012-09-20 3 views
1

나는 자바에서 매우 근본적인 문제가있다. 나는 이것을 모든 곳에서 찾았지만 어느 곳에서나 해결책을 찾지 못했습니다.가비지 수집의 연쇄 반응

이진 트리 삭제에 대해 읽으려고합니다. DFS, BFS 등을 사용하기 전에 트리의 루트에 대한 모든 활성 참조를 해제하면 트리 전체가 자동으로 GCed되어야한다고 생각했습니다. 내 말은 루트에 대한 유일한 활성 참조를 삭제하면 루트가 GCed가되어야하므로 루트의 자식에 대한 활성 참조가없고 GCed를 가져와야한다는 것입니다. 전체 트리가 GC 될 때까지 연쇄 반응으로 계속해야합니다. 내가 맞습니까, 아니면 내 분석에 문제가 있습니까?

가정 : 모든 노드는 부모 만 참조하고 다른 노드는 참조하지 않습니다.

+0

관련 : http://stackoverflow.com/questions/176745/circular-references-in-java – nhahtdh

+1

Java GC는 내 이해에 의해 프로그램이 더 이상 메모리 덩어리를 참조 할 수 없을 때 모든 것을 정리해야합니다. – nhahtdh

+1

네, 당신 말이 맞아요. 일반적으로 GC는 실제로 매우 똑똑합니다. –

답변

3

일반적으로 당신이 옳습니다. 그 수 있습니다.

그러나 특정 의미에서 대부분의 가비지 수집기는 이와 같이 작동하지 않습니다. 트리의 루트에 대한 마지막 링크를 제거하면 GC가 즉시 실행되지 않습니다. 오히려, 그것은 양호한 (예를 들어, 효율적인) 시간이 될 때까지 기다린다. 그런 다음 여전히 도달 할 수있는 모든 개체 (예 : 휴지 제외)를 추적하고 개체를 처리 한 다음 나머지 개체를 회수합니다. 실제로 가장 좋은 가비지 컬렉터는 "나머지를 되찾는"프로세스가 매우 저렴합니다.

참조 카운팅 (소위) 가비지 수집기는 예외입니다. 여기서 마지막 참조를 제거하면 참으로 즉각적인 삭제 삭제. 그러나 레퍼런스 카운팅은 주류 가비지 수집 언어에서 사용되지 않습니다. 느리며주기가있는 데이터 구조를 회수 할 수 없기 때문입니다. 확실히 Java 구현에서는 가비지 수집을 위해 참조 카운팅을 사용했습니다.