2011-03-07 4 views
8

제 프로그램이 매우 높은 속도 (약 1MB/초)로 Gen2로 메모리를 승격시키고 있으며 Gen2 수집이 발생할 때 성능이 저하됩니다. 어떤 오브젝트가 승격되었는지 이해하려고 할 때마다 실패했습니다. 주로 windbg에서 2 개의 덤프를 열었을 때 Gen2 크기가 증가한 메모리가 "Free"로 표시 되었기 때문에 실패했습니다. 고정 된 개체로 인해 문제가 발생하고 있지만 성능 통계에서는 고정 된 개체 수가 매우 적음 (약 2-4) 것으로 판단되었습니다..Net 가비지 컬렉터 - 런타임 중에 Gen2로 승격 된 내용을 확인하십시오.

지금 제가 시도하는 것은 런타임 중에 Gen2로 승격 된 객체를 어떻게 든 식별하는 것입니다. 이렇게하는 방법이 있습니까?

+1

귀하의 일회용 물건을 처분하지 않은 것으로 의심됩니다. undisposed 대부분의 개체는 finalizer를 실행하고 거기에서 처분합니다. Finalizers는 GC 수집을 차단합니다 ("최종 결정이 콜렉션에주는 영향"섹션 (http://msdn.microsoft.com/en-us/library/ms973837.aspx#dotnetgcbasics_topic5)). –

+1

큰 물체를 할당하고 있습니까? 대형 오브젝트 힙에 할당 된 AFAIK 오브젝트는 즉시 gen 2로 이동합니다. – CodesInChaos

답변

5

WinDbg를 사용하여 이러한 문제를 디버깅 할 수 있습니다. 가비지 수집 루틴에 중단 점을 설정하고 관리되는 힙을 검사 한 다음 가비지 수집을 수행 한 다음 관리되는 힙을 다시 검사하여 현재 어떤 개체가 Gen2에 있는지 확인하십시오. 여기

로 시작하는 몇 가지 링크입니다 :

Tracking down managed memory leaks

How to iterate on the objects present in the .NET managed heap?

Tess Ferrandez' blog

Investigating .NET Memory Management and Garbage Collection

그 질문에 대한 직접적이고 상세한 답이 아니다 미안하지만, 당신에게 출발점을 주어야합니다.

+0

WinDBG를 사용하여 Strike를로드 할 필요가 없습니다. VS2003은 중단 점에서 중지 될 때 "즉시"창을 통해로드 할 수 있기 때문입니다. 2010 년 문서 도구 - http://msdn.microsoft.com/en-us/library/yy6d2sxs.aspx - Bing의 다른 버전에 대한 지침. – stephbu

1

많은 LOH를 할당 할 수 있습니다. 여기에 LOH 할당에 대한 중단 점이있는 방법이 있습니다. Winbdg 내의 bp mscorwks!wks::gc_heap::allocate_large_object “!CLRStack”.

HTH

0
당신은 세대 (0)와 겐 (1) 컬렉션을 강제로 시도하고 그것이 당신이 GC 맛의 종류를 사용하고, 또한

GC.Collect(1,GCCollectionMode.Forced); 
GC.WaitForPendingFinalizers(); 
CreateDump(); 

수행을 완료 한 후 즉시 스냅 샷을 생성 할 수

?

2

약간의 3 자 memory profilers for .NET이 있습니다. 시도해보십시오. 대부분 무료 사용 기간이 허용됩니다. 선도적 인 메모리 프로파일 러가 어떤 일이 빠르게 진행되는지 보게 될 것으로 기대합니다.

관련 문제