2009-11-28 3 views
8

WeakReference.Target에서 참조하는 대상 객체가 가비지 수집되었을 때 WeakReference는 어떻게됩니까? WeakRerence는 살아 있고 기존 존재를 유지합니까? 내가 묻는 이유는 WeakReferences 목록이 List에 저장되어 있기 때문입니다. 런타임 중에 새로운 WeakReferences가 지속적으로 목록에 추가됩니다. 이제 대상 개체가 죽으면 버려진 WeakReference를 직접 정리해야합니까? 그렇다면 어떻게 할 수있는 영리한 트릭이 있습니까? WeakReference가 포기되면 알려줄 수 있습니까? 또는 WeakReference 인스턴스가 해당 목록에서 제거 될 수 있는지 확인하기 위해 해당 목록을 자주 반복하는 타이머를 도입해야합니까?WeakReference.Target의 GC 이후 WeakReference에 무슨 일이 발생합니까? Target

+0

그건 그렇고, 문제의 말에 잘 해내 자면 .net에 대한 경험이 거의 없지만 문제가 무엇인지 분명히 느꼈습니다. –

답변

12

약한 참조에서 자주 발생하는 문제입니다. 참조 자체에는 정상적인 포인터가 있기 때문에 참조 자체는 살아 있습니다. 제안 할 때마다 수시로 "수동 가비지 수집"을 수행해야합니다. 다른 이유로 목록을 탐색 할 때 스텁을 정리할 수 있습니다. 목록의 사용 패턴에 따라이 "측면에서"가비지 수집으로도 충분할 수 있습니다.

정리의 유일한 목적으로 목록을 "자주"반복하지 마십시오! 각 죽은 그루터기는 단지 두 단어의 기억을 낭비합니다. 목록을 자주 사용하지 않는 경우 자주 청소하는 데 드는 계산 비용이 정당화되지 않으며 자주 사용되는 경우 위에 제안 된대로 청소됩니다.

다른 가비지 수집 시스템에 있지만 문제가 너무 유사하므로 이해할 수 있다면 this article에 관심이있을 수 있습니다.

+0

목록에서 목록에 액세스하지 않는 경우 항목을 추가 할 때 마지막 정리와 마지막 수집 사이에 추가 된 항목 수가 (GC 카운터 사용) 특정 목록 크기의 일부 중요한 것은 일반적으로 모든 정크가 정리되는 것이 아니라 즉각적인 수집에 적합하지 않은 정크의 양이 제한되어 있다는 것입니다. BTW, WeakReferences는 "한 마디 단어"이상의 비용이 듭니다. 그것들은 엄청나게 비싸지는 않지만 약 1 백만 개의 사용되지 않는 약한 심판은 프로그램을 막을 수 있습니다. – supercat

6

WeakReference 객체에 대한 강력한 참조가 있으므로 GC'ed가되지 않습니다. WeakReference를 사용하여 대상이 GC로 처리되었음을 확인할 수 있기 때문에 의도적으로 설계된 것입니다.

그래, 당신은 타이머 방식으로 가야 할 것입니다.

추가 :Garbage Collection Notifications을 살펴볼 수도 있습니다.

+1

+1하지만 GC 알림에 대해서는주의해야합니다. 왜냐하면 GC의 새로운 (멋진) 기능을 사용 중지하기 때문입니다. – user7116

1

의도 한 사용법은 WeakReferences에 ReferenceQueue를 등록하는 것입니다. 대상이 수집되면 참조가 대기열에 추가됩니다. 대기열에서 폴링하거나 대기하고 WeakReference 오브젝트를 목록에서 제거 할 수 있습니다.

+2

이 메커니즘은 .NET입니까? 나는 당신이 자바를 언급하고 있다고 생각합니다 ... – bitbonk

+0

오, 오 죄송합니다, 나는 약간의 실명을 가졌습니다. 어떤 .NET도 사용하지 않으므로 클래스가 정확히 같은 이름을 가질 때 혼란 스럽습니다. – OrangeDog

관련 문제