WeakReference.Target에서 참조하는 대상 객체가 가비지 수집되었을 때 WeakReference는 어떻게됩니까? WeakRerence는 살아 있고 기존 존재를 유지합니까? 내가 묻는 이유는 WeakReferences 목록이 List에 저장되어 있기 때문입니다. 런타임 중에 새로운 WeakReferences가 지속적으로 목록에 추가됩니다. 이제 대상 개체가 죽으면 버려진 WeakReference를 직접 정리해야합니까? 그렇다면 어떻게 할 수있는 영리한 트릭이 있습니까? WeakReference가 포기되면 알려줄 수 있습니까? 또는 WeakReference 인스턴스가 해당 목록에서 제거 될 수 있는지 확인하기 위해 해당 목록을 자주 반복하는 타이머를 도입해야합니까?WeakReference.Target의 GC 이후 WeakReference에 무슨 일이 발생합니까? Target
답변
약한 참조에서 자주 발생하는 문제입니다. 참조 자체에는 정상적인 포인터가 있기 때문에 참조 자체는 살아 있습니다. 제안 할 때마다 수시로 "수동 가비지 수집"을 수행해야합니다. 다른 이유로 목록을 탐색 할 때 스텁을 정리할 수 있습니다. 목록의 사용 패턴에 따라이 "측면에서"가비지 수집으로도 충분할 수 있습니다.
정리의 유일한 목적으로 목록을 "자주"반복하지 마십시오! 각 죽은 그루터기는 단지 두 단어의 기억을 낭비합니다. 목록을 자주 사용하지 않는 경우 자주 청소하는 데 드는 계산 비용이 정당화되지 않으며 자주 사용되는 경우 위에 제안 된대로 청소됩니다.
다른 가비지 수집 시스템에 있지만 문제가 너무 유사하므로 이해할 수 있다면 this article에 관심이있을 수 있습니다.
목록에서 목록에 액세스하지 않는 경우 항목을 추가 할 때 마지막 정리와 마지막 수집 사이에 추가 된 항목 수가 (GC 카운터 사용) 특정 목록 크기의 일부 중요한 것은 일반적으로 모든 정크가 정리되는 것이 아니라 즉각적인 수집에 적합하지 않은 정크의 양이 제한되어 있다는 것입니다. BTW, WeakReferences는 "한 마디 단어"이상의 비용이 듭니다. 그것들은 엄청나게 비싸지는 않지만 약 1 백만 개의 사용되지 않는 약한 심판은 프로그램을 막을 수 있습니다. – supercat
WeakReference 객체에 대한 강력한 참조가 있으므로 GC'ed가되지 않습니다. WeakReference를 사용하여 대상이 GC로 처리되었음을 확인할 수 있기 때문에 의도적으로 설계된 것입니다.
그래, 당신은 타이머 방식으로 가야 할 것입니다.
추가 :Garbage Collection Notifications을 살펴볼 수도 있습니다.
+1하지만 GC 알림에 대해서는주의해야합니다. 왜냐하면 GC의 새로운 (멋진) 기능을 사용 중지하기 때문입니다. – user7116
- 1. 무슨 일이 CWnd 아이콘
- 2. Microsoft에 무슨 일이 일어났습니다 .FSharp.Math.Matrix?
- 3. #WT에 무슨 일이 일어 났습니까?
- 4. syscalls.h에 무슨 일이 일어 났습니까?
- 5. NUnit에 무슨 일이 일어 났습니까?
- 6. nStatic에 무슨 일이 일어 났습니까?
- 7. WeakReference에 중복 속성이 있습니까?
- 8. 텍스트 상자를 클릭하면 배경에서 어떤 일이 발생합니까?
- 9. tools :: texi2dvi - 무슨 일이 일어 났습니까?
- 10. 내가 무슨 일이 일어나고 있는지 정확히 모르겠어요
- 11. 설명이 임베디드 mp3 플레이어로 무슨 일이 일어나는지
- 12. setTimeout() - IE6에서 무슨 일이 벌어지고 있습니까?
- 13. 이벤트 집계 ... 정확히 무슨 일이 벌어지고 있습니까?
- 14. WCF RequestChannel; 정말로 무슨 일이 일어 났습니까?
- 15. javascript // 여기에 무슨 일이 일어나고 있습니까?
- 16. Zend와 (으)로 무슨 일이 일어나는가
- 17. ReportingService.Render 메서드()에 무슨 일이 발생했는지
- 18. Delphi 2010 : TRTTIConstructor에 무슨 일이 일어 났습니까?
- 19. 술어는 C에서 무슨 일이 일어나는지 궁금합니다.
- 20. SQL 에이전트 로그온 - 무슨 일이 일어나고 있습니까?
- 21. JDK6u18에서 JAXB의 NamespacePrefixMapper에 무슨 일이 일어났습니다
- 22. aspnet_regsql을 실행할 때 어떤 일이 발생합니까?
- 23. 이 명령을 실행하는 동안 정확히 무슨 일이 발생합니까? mvn -pl <project list>
- 24. 파일 업로드 중에 어떤 일이 발생합니까?
- 25. 아약스를 호출하면 서버 측에서 어떤 일이 발생합니까?
- 26. swf가 임베드 될 때 어떤 일이 발생합니까?
- 27. NameValueCollection의 deserialization 중에 어떤 일이 발생합니까?
- 28. 매개 변수 바인딩 : 후드에서 어떤 일이 발생합니까?
- 29. 아이폰 애플리케이션이 시작될 때 어떤 일이 발생합니까?
- 30. applicationDidFinishLaunching이 호출되기 전에 어떤 일이 발생합니까?
그건 그렇고, 문제의 말에 잘 해내 자면 .net에 대한 경험이 거의 없지만 문제가 무엇인지 분명히 느꼈습니다. –