2010-07-12 3 views
2

메모리 누수가있는 오래되고 복잡하고 복잡한 레거시 시스템을 수정하려고합니다. 문제를 되짚어보고 메모리 누수를 설명하는 가장 좋은 방법은 "의도적으로"입니다. 간단히 말하면, 객체가 버려진 후에 객체를 참조하는 이벤트 관찰자가 있습니다. 이러한 이유로 개체는 가비지 수집기에서 수집 할 수 없으며 무기한으로 메모리에 남아 있습니다.System.OutOfMemoryException

현재 인스턴스에 대한 참조를 보유하고있는 객체의 모음을 가져 오는 방법이 있습니까?

답변

1

Sosex 확장 DLL과 함께 WinDbg를 사용하여 기술을 테스트 해 볼 수 있습니다. WinDbg에 익숙하지 않다면 .NET 디버깅 정보의 금광 인 Tess Ferrandez의 blog을 읽어보십시오.

기본적으로 Sosex.dll에는 사용자가 지정한 특정 개체 주소에 대한 참조가있는 개체를 나열하는 !Refs 명령이 있습니다. 예를 들면 다음과 같습니다.

Usage: 
!refs <hexObjectAddr> 

Lists all references held by the specified object 
Lists all references to the specified object (searches heaps, stacks, registers, handle tables and the freachable queue) 

Refs are listed in the following format: 
hexAddr decSize strTypeName 

Sample output: 
0:000> !sosex.refs 7fff2970 
Objects referenced by 7fff2970: 
7fff1100   64 System.IO.__ConsoleStream 
7fff1388  136 System.Text.SBCSCodePageEncoding 
7fff2c50   48 System.Text.DecoderNLS 
7fff2c80  280 System.Byte[] 
7fff2d98  536 System.Char[] 
7fff1140   24 System.Byte[] 

Objects referencing 7fff2970: 
7fff2fb0   32 System.IO.TextReader+SyncTextReader 
`` 

매우 하드 코어 솔루션이므로이 경우 새로 준비해야합니다. 그러나 .NET 응용 프로그램을 디버깅하는 매우 강력한 방법이 될 수 있습니다.

3

나는 그런 식으로는 모른다.
약한 참조는 이러한 상황에서 유용 할 수 있습니다.
둘러보기 here

1

WinDBG를 사용하십시오. 다음은 Tess 블로그에서 WinDBG를 사용하는 finding memory leaks의 예입니다.

3

아니요, 디버거 API를 사용하지 않는 한 아니요.

이런 종류의 한 가지 옵션은 WeakReference 클래스입니다. 이벤트와 함께 WeakReference을 검색하면이 문제점을 정확히 처리하는 방법에 대한 제안이있는 많은 문서를 찾을 수 있습니다. 그들 중 누구도 내가 기억하는 것으로부터 특별히 깨끗하지는 않지만 합리적으로 잘 작동해야합니다.

예로서, this page은 다수의 상이한 접근법을 설명한다.

관련 문제