2008-10-22 4 views
27

C#에서 메모리 누수의 원인을 추적하는 데 몇 가지 조언을 사용할 수 있습니다. 메모리 누수가 무엇인지 이해하고 C#에서 왜 발생하는지 알지만, 과거에 도구/전략을 사용하여 문제를 해결 한 적이 있는지 궁금합니다.C# WPF의 메모리 누수

.NET 메모리 프로파일 러를 사용 중입니다. 관리하는 창을 닫은 후에도 내 거대한 주요 개체 중 하나가 메모리에 남아있는 것으로 나타 났지만 모든 링크를 심각하게 처리 할 수 ​​있는지는 잘 모릅니다.

내가 명확하지 않은 경우 질문에 대답 만 게시하면 응답으로 내 질문을 편집합니다. 감사!

+0

또한 마녀 객체가 지정된 객체를 가리키는 것처럼 개미 메모리 프로파일 러를 시도하십시오. –

답변

39

디버거에 침입 한 후 직접 실행 창에이를 입력 :

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\sos.dll 

경로는 sos.dll 할 수는 다릅니다. 올바른 경로를 찾는 방법은 모듈 창에서 mscorwks.dll을 찾는 것입니다. 어디에서로드 된 sos.dll에 대한 올바른 경로입니다.

그런 다음이를 입력 : 도달 할 수없는 것을 보장합니다

System.GC.Collect() 

가 수집됩니다. 다음을 입력하십시오 :

!DumpHeap -type <some-type-name> 

그러면 주소가있는 기존 인스턴스의 테이블이 표시됩니다. 이 같은 인스턴스 살아 유지되고 있는지 확인할 수 있습니다

!gcroot <some-address> 
+0

가비지 컬렉션을 작동 시키려면 System.GC.Collect()를 사용해야했습니다. – nash

+0

디버거가 중단되었을 때 디버거가 중단 된 위치에 따라 달라질 수 있습니다. 관계없이 작동하도록 내 대답을 수정하겠습니다. –

8

.NET 메모리 프로파일 러는 훌륭한 도구, 내가 WPF 응용 프로그램에서 메모리 누수를 진단하는 데 자주 사용하는 것입니다.

알고 계시 겠지만 확실한 방법은 특정 기능을 사용하기 전에 스냅 샷을 찍은 다음 스냅 샷을 사용하거나 창을 닫은 다음 두 번째 스냅 샷을 찍는 것입니다. 스냅 샷을 사용하면 특정 유형의 오브젝트가 얼마나 할당되었지만 해제되지 않았는지 확인할 수 있습니다. 이는 누수입니다.

유형을 두 번 클릭하면 프로파일 러가 해당 유형의 객체를 활성 상태로 유지하는 최단 루트 경로를 표시합니다. .NET 개체가 WPF에서 누출 될 수있는 여러 가지 방법이 있으므로보고있는 루트 경로를 게시하면 궁극적 인 원인을 파악하는 데 도움이됩니다. 그러나 일반적으로 이러한 객체가 객체 위에있는 이유를 이해하고, 윈도우가 닫힐 때 이벤트 처리기, 바인딩 등을 분리 할 수있는 방법이 있는지 확인하십시오.

최근에 특정 바인딩으로 인해 발생할 수있는 특정 memory leak에 대한 blog entry을 게시했습니다. 그 특정 유형의 누설에 대해서는 오류가있는 Binding을 찾는 데 유용한 코드가 있습니다.