자바의 순환 참조는 GC에서 문제가되지 않습니다. 이는 "도달 가능성"이라는 개념 때문에 문제가되지 않습니다.
객체 참조는 노드가 객체이고 에지가 객체 참조 인 유향 그래프로 생각할 수 있습니다. 그래프에는 "루트 노드"라고하는 노드 집합이 있습니다.이 노드는 VM의 일부 스레드가 직접 액세스 할 수있는 개체입니다. 스택상의 함수 호출에서 로컬 변수, 클래스의 정적 필드 등이 있습니다.
가비지 수집을 수행 할 때 VM은 이러한 루트 노드로 시작하여 "사용 중"으로 표시합니다. 그런 다음이 사용 중 노드에서 나오는 각 에지 (즉, 사용중인 객체에서 참조되는 각 객체)에 대해 사용 중이라는 표시가있는 등 아무 것도 남지 않을 때까지 계속 표시됩니다 표. 그런 다음 "사용 중"으로 표시되지 않은 모든 개체는 안전하게 가비지 수집 할 수 있음을 알고 있습니다.
이제, 당신은 몇 가지 방법에있어, 예를 들어 가정 해 봅시다, 다음과 같은 코드가 있습니다
a = new A();
a.b = b;
b = new B();
b.a = a
는 이제 a와 b 사이에 순환 참조가 있습니다. 그리고이 두 객체는 스택에있는 메소드 호출의 로컬 변수이기 때문에 루트 집합의 일부입니다.
그런 다음 해당 방법을 종료하면 a와 b는 더 이상 루트 집합의 일부가 아닙니다. 그리고 당신이 다른 곳에서 그곳에 대한 언급을하지 않는 한, a 나 b에 대한 언급이있는 것은 없습니다.
이제 개체 참조 그래프에는 a 및 b가 포함 된 그래프의 일부 연결이 끊어졌습니다. 둘 다 여전히 서로에 대한 참조를 가지고 있지만 그 외에는 참조가 없습니다. 루트 집합에서 도달 할 수 없으므로 GC는 사용되지 않고 가비지 수집을 할 수 있음을 알고 있습니다. 서로 참조 할 수 있습니다.
(이 가비지 컬렉션의 다소 단순화 된 설명이 있습니다,하지만 여전히 작동 방법에 대한 유용한/합리적인 정신 모델) 그래서 짧은 대답은
- "예, 순환 참조가 그러나 이것은 문제가되지 않습니다. 두 객체가 더 이상 도달 할 수 없게되면 모두 수집 될 것이기 때문입니다. "
jusr가 자신의 HashSet를 사용하여 참조 (ImageView -> ClassA 인스턴스의 ID) ? –
Olegas