가비지 수집기 및 순환 참조
다음 두 클래스를 고려하십시오.
public class A
{
B b;
public A(B b) { this.b = b; }
}
public class B
{
A a;
public B() { this.a = new A(this); }
}
위와 같이 디자인 된 클래스가있는 경우 이러한 클래스의 개체는 가비지 수집기 (GC)에서 수집됩니까?
이렇게한다고 가정합니다.
void f()
{
B b = new B();
}
이 메서드에서는 B
called 의 인스턴스를 만들고 b
메서드가 반환되면 b
범위를 벗어나 GC에서 수집 할 수 있어야하지만 수집하려면 a
먼저 수집해야하는 멤버 인 의 회원 B
인을 (를) 수집 a
하고 수집하려면 b
먼저 수집해야합니다 A
. 원형이됩니다. 그래서 내 질문은 : 그러한 순환 참조가 GC가 객체를 수집하지 못하게할까요?
- 그렇다면이 문제를 어떻게 피할 수 있습니까? 클래스 디자인에 순환 참조가 없는지 어떻게 확인할 수 있습니까? 순환 참조를 감지하는 데 도움이되는 도구 (또는 컴파일러 옵션)가 있습니까?
- 그렇지 않다면, 어디서 왜
WeakReference
수업 을 사용 합니까? 그 목적은 무엇입니까?
.Net 가비지 수집기는 절대적으로 순환 참조를 처리 할 수 있습니다. 매우 가비지 수집기가 작동하는 방법의 높은 수준보기는 ...
- 로컬, 정적 및 GC 고정 개체로 시작합니다. 수집 할 수 없습니다.
- 이러한 개체의 자식을 통과하여 도달 할 수있는 모든 개체를 표시합니다.
- 표시되지 않은 모든 개체를 수집합니다.
이렇게하면 순환 참조를 잘 수집 할 수 있습니다. 수집 할 수없는 것으로 알려진 객체에서 이들 중 어느 것도 도달 할 수없는 한 순환 참조는 본질적으로 관련이 없습니다.
참고 :이 답변을 간단하고 직접적으로 유지하기 위해 재미있는 세부 정보를 많이 생략했습니다.
아니요, GC는 순환 참조를 처리 할 수 있으므로 문제가되지 않습니다.
MSDN은 말한다
객체 그룹이 서로에 대한 참조를 포함하지만 이러한 객체가 스택 또는 공유 변수에서 직접 또는 간접적으로 참조되지 않는 경우 가비지 수집은 자동으로 메모리를 회수합니다.
순환 참조는 가비지 수집기에 영향을주지 않으며 B의 인스턴스를 완벽하게 수집 할 수 있습니다.
가비지 수집기는 범위를 벗어난 후에 아무도 B의 인스턴스를 참조 할 수 없다는 것을 알고 있으며 결과적으로 아무도 B의 인스턴스를 사용하여 A를 간접적으로 참조 할 수 없습니다.
순환 참조가 문제가되지 않는다는 여러 답변이 이미 설명되어 있습니다.
약한 참조에 관해서는-그것들을 사용하는 이유는 캐싱입니다.
GC가 개체 종속성 트리를 탐색 할 때 그는 약한 참조를 무시합니다. 즉, 개체에 대한 유일한 참조가 약한 참조 인 경우 가비지 수집되지만 참조 생성과 사용 시도 사이에 가비지 수집이없는 경우에도 개체에 액세스 할 수 있습니다.
참조 URL : https://stackoverflow.com/questions/8840567/garbage-collector-and-circular-reference
'program tip' 카테고리의 다른 글
PHP를 사용하여 MySQL 데이터베이스에 저장하는 IP 주소 (0) | 2020.12.15 |
---|---|
Android, 내 애플리케이션에서 QR 코드를 읽는 방법은 무엇입니까? (0) | 2020.12.15 |
메모장 ++에서 현재 줄을 삭제하고 새 줄을 추가하는 방법은 무엇입니까? (0) | 2020.12.15 |
사용자 지정 .php 파일에 WordPress 기능을 포함하는 방법은 무엇입니까? (0) | 2020.12.15 |
암시 적으로 'string'형식을 'System.Threading.Tasks.Task로 변환 할 수 없습니다. (0) | 2020.12.14 |