2013-11-21 2 views
3

Google 애플리케이션에서 GC 및 메모리 사용을 조사 중이며 수천 명의 최종 생존자가있는 것으로 나타났습니다. 불행히도 그 숫자만으로는 문제가 있는지 여부를 알 수 없습니다. 그러나 우리는 일반적인 성능 문제를보고 있으며, 메모리 사용량이 많고 GC에서 많은 시간을 소비합니다.마무리 대기열 및 종료 생존자를 조사하려면 어떻게해야합니까?

이상적으로는 제어 할 수있는 항목이 없으므로 종료 대기열에 들어가야합니다. 버그 일 경우 버그입니다. 이를 확인하는 데 사용할 수있는 방법이나 도구가 있습니까? 필자가 들었던 한 가지 제안은 실행될 때마다 기록되는 finalizers로 특수 빌드를하는 것이지만, 이것은 많은 노력이 필요하며 우리가 소유 한 유형의 객체에서만 작동합니다. 더 쉬운 방법이 있습니까?

그리고 최종 결정 생존자를 조사 할 가치가 있습니까? 그렇다면 어떻게?

+0

이것은 사용자가 찾고있는 것이 아닐 수 있습니다. 그러나 CRM과 관련하여 Outlook과 동기화 할 때 플러그인을 만들 때 항상 많은 시간을 소비했습니다. 마지막으로 "아웃룩과의 커뮤니케이션"과 "UI 스터프"에 대한 두 가지로 애플리케이션을 분할했다. "outlook과의 통신"부분이 별도의 앱 도메인에서 실행되었습니다. 아무 것도 앱 도메인 언로드에서 생존 할 수 없습니다. –

답변

5

Psscor2 또는 Psscor4 확장자 (사용자가 사용하는 버전에 따라 다름)를 사용하십시오. 불행히도 아직 .NET 4.5 버전이 없습니다. 디버깅 환경 (WinDbg 설치 및 폴더 Psscor 파일로 복사)을 설정 한 후 프로세스 덤프를 만듭니다. 당신은 Procdump 도구의 도움으로, 예를 들어 쉽게 수행 할 수 있습니다

procdump -ma <PID> 

그런 다음 파일을 사용하여로드 덤프 (load dump) -> 열기 호감 덤프 옵션을 선택합니다. Psscor의로드 해당 버전 :

.load psscor4 

그런 다음, (필요한 경우) Microsoft 서버에서 다운로드 기호에 명령을 실행하면 인터넷에 연결되어 있는지 확인하십시오 :

!symfix 

그리고 지금부터 당신에게 액세스 권한을 to very much interestings 명령을 사용하십시오 (목록을 보려면 !help을 찾으십시오).마무리 큐를 보려면 : 이것은 당신에게 많은 도움이 될

7aa143e0  166  20,584 System.Diagnostics.PerformanceCounter 
79b5f6c8  543  21,720 System.Reflection.Emit.DynamicResolver 
673893a8  953  22,872 System.Web.HttpResponseUnmanagedBufferElement 

:이

!finalizequeue 

당신은 같은 개체의 목록을해야합니다. 하지만 해당 객체 (!do 7aa143e0)를 검사하거나 참조 (!gcroot <address>)를 찾을 수도 있습니다.

+0

우수 - 매우 도움이됩니다. 프로세스를 덤프 할시기를 어떻게 알 수 있습니까? 예 : windbg에서 길이가 보이는 대기열에 조건부 중단을 넣으시겠습니까? 또는 GC 성능 카운터 등을 기반으로 정보에 근거한 추측을해야합니까? – Rob

+0

특정 성능 카운터의 임계 값에서 덤프를 만들도록 procdump를 구성 할 수 있습니다. –

0

그리고 최종 결정 생존자를 조사 할 가치가 있습니까?

예, 성능 저하 및 리소스 영향이 있습니다.

그렇다면 어떻게됩니까?

코드 검사를 제안합니다.

유형에 파이널 라이저가 있습니까? 그렇다면 올바르게 구현 되었습니까? 관리되지 않는 리소스를 직접 제어하는 ​​경우에만 파이널 라이저가 필요합니다. 파이널 라이저가있는 경우 IDisposable을 구현하고 결정적 정리를 사용해야합니다. 그러면 최종자를 호출하지 않게됩니다. GC.SuppressFinalize(this)Dispose 메소드로 호출하면 인스턴스가 이미 삭제 되었기 때문에 마무리되지 않습니다.

파이널 라이저가 라이브러리 코드에있는 경우 이러한 유형은 IDisposable을 구현하거나 구현해야하며 finalizers가 호출되지 않도록 이러한 인스턴스를 결정적으로 처리해야합니다.

관련 문제