2012-09-07 6 views
1
  1. WeakReferences로 채워지는 사전이 있습니다.
  2. 웹 서비스 A : 개체를 만들고 약한 참조 사전에 배치합니다. (1)
  3. 웹 서비스 A는 객체를 강력한 레퍼 런으로 유지하지만 가끔은 그렇지 않습니다.

은 내 문제 : 나는 쓰레기 수집기가 즉시 수집하지 않기 때문에 약한 참조 사전에서 제거되어야한다 물체를 추적 할 수논리 목적을 위해 수집되어야하는 추적 개체

, 그것은 단지 시간의 임의의 예측할 수없는 시간 후에 수집합니다.

동작

실시 예 1, 일치하지 않는 예상대로 가변 EX1 즉시 수집 작동한다.

Sub Example1(id as integer) 
Dim ex1 as new Object 
dim t as new WeakReference With {.target = ex1}; 
WeakReferenceDictionary.add(id,ex1) 
End Sub<br> 

예 2 '이 작동하지 않습니다는, 외부 1은 imeediately 내가 시도

Sub Example1(id as integer) 
    Dim ex1 as new Object 
    dim t as new WeakReference With {.target = ex1}; 
    WeakReferenceDictionary.add(id,ex1) 

    otherclass.refObject = ex1 
    otherclass.refObject = Nothing 

End Sub<br> 


를 수집하지 않습니다.
모듈 1 안에 WeakDictionary를 배치합니다 (콘솔 응용 프로그램 임).
GC.Collect를
하는 GC.Collect (0)
GC.Collect를 (1)
GC.Collect를 (2)

내 질문. 응용 프로그램의 성능이 저하되는 경우에도 가비지 수집을 강제 실행해야합니다. 나는 논리 목적을 위해 GC를 사용해서는 안된다는 것을 알고 있지만, 내 솔루션은 이런 식으로하는 것이 정말 편리합니다.

+0

물론 ... 나는이 솔루션 자체의 팬이 아니지만 애플리케이션에 의해 참조 된 로그너가 없을 때 이러한 개체를 추적해야합니다. 모든 응용 프로그램에서 참조 카운터를 구현하는 것은 엄청난 노력 일 것이며 가비지 수집 알고리즘을 사용하는 것이 훨씬 간단하고 우아하며 신뢰할 수 있습니다. GC에 대한 제안 대신 실제로 강제하는 방법이 있는지 알고 싶습니다. – jri

답변

2

포기와 함께이 게시물을 시작하겠습니다 : 가비지 수집 내부에 의존하여 올바른 접근 방식을 선택했음을 회의적입니다. 예측할 수 없으며 예측할 수 없으며 작동 여부가 테스트 되었더라도 코드가 손상 될 수 있습니다. .NET 패치 릴리스. 당신은 디버거에서 실행 또는 디버그 모드를 내장하고

  1. :

    는 개체가 수집되지 않았 여러 이유가 있습니다. 이렇게하면 객체 수명이 약간 연장됩니다 (JIT는 가변 내용을 사용하지 않는 것으로 표시하지 않으므로 범위를 벗어난 경우에도 변수를 디버깅 할 수 있습니다).

  2. 당신은 GC.Collect를가 엉뚱한 곳
  3. 개체가

하나가 아마도뿐만 아니라 다른 이유가있다하더라도 당신은 WaitForPendingFinalizers를 호출하지 않은에서 호출을 배치합니다.

어떻게 해결할 수 있습니까? GC에 의존하지 마십시오. Dispose를 구현하고 호출하거나 참조 계산 기술로 전환하는 것과 같은 결정 론적 동작에 의존합니다.

+0

신속한 답장을 보내 주셔서 감사합니다. 릴리스 모드에서 VisualStudio 외부에서도 테스트를 마쳤습니다. WaitForPendingFinalizers 메서드는 스레드를 중지시킬 수 있기 때문에 나를 위해 작동하지 않습니다 (동시에 실행할 수 있어야 함). 구현 개체에 관해서는 이러한 개체의 Finalize 메서드에 대한 논리를 가지고 있지만 예상 한대로 호출되지 않았습니다. 면책 조항과 관련하여 전적으로 동의합니다. 나는 GC를 망치면 안된다. 그러나 우리는 더 나은 해결책을 찾을 수 없습니다. – jri

0

exacerbatedexpert 덕분에; 그리고 www.sellsbrothers.com/writing/refcount_rotor 기사를 읽으십시오.실제로 처분 될 모든 물체가 실제로 예측 가능한 방식으로 처리된다는 것을 보장하는 GC를 실제로 강요한다는 것이 실용적이지 않다는 것을 알게되었습니다.

참조 용 카운터 (기사에 표시된대로)를 구현해야합니다.

발견 된 또 다른 해결책은 생성 된 특정 클래스의 모든 개체 배열을 작성한 다음 루트 노드를 사용하여 두 번째 살펴보기 Reflection을 수행 한 다음 두 노드를 비교하여 누가 missig인지 찾아냅니다. 이 접근법은 일관된 결과를 보장하지만 전체 루트 - 하위 검사를 수행해야하는 자원을 많이 소모합니다.

답장을 보내 주셔서 감사합니다.

+0

다음은 Microsoft의 또 다른 흥미로운 기사입니다. http://msdn.microsoft.com/en-us/magazine/cc163316.aspx – jri

관련 문제