2011-03-16 11 views
2

저는 C#/WPF 응용 프로그램에서 몇 가지 OutOfMemoryExceptions를 실행했습니다. 메모리 사용량을 프로파일 링하려고 시도하는 동안 혼란스러운 데이터가 발생했습니다.Windows 응용 프로그램의 실제 메모리 풋 프린트 찾기

일반적으로 응용 프로그램이 실행 중일 때 Windows 작업 관리자는 메모리 사용량이 약 34MB로 표시됩니다 (개체가 생성되어 가비지 수집됨에 따라 약간 바운스 됨). CLR ProfilerdotTrace Memory과 같은 메모리 프로파일 링 응용 프로그램을 실행하면 총 메모리 사용량이 약 1.2MB로 표시됩니다.

왜 이렇게 큰 불일치가 있습니까? 작업 관리자는 이러한 프로파일 러가 인식하지 못하는 것을 무엇입니까?

업데이트 : 응용 프로그램에 일부 진단 코드를 추가하여 Process 클래스를 통해 다양한 메모리 정보를 자주 인쇄합니다.

내 앱을 실행하는 동안 예외 발생시 메모리 덤프를 수행하려면 DebugDiag에 규칙을 설정합니다. 나는 예외를 강제하고 메모리 덤프가 발생했습니다. 이 시점에서 내 앱의 메모리 사용량은 (작업 관리자가 보여주는 것처럼) 32MB에서 145MB로 증가하여 거기에 머물렀다.

이 점프는 아래 표 (WorkingSet64)에서 볼 수 있습니다. 나는 여전히 Process 클래스가 제공하는 모든 종류의 메모리 정보를 이해하려고 노력 중이다. 외부 응용 프로그램이 내 응용 프로그램의 작업 집합을 어떻게 이렇게 키우게합니까?

Link to data table here.

+2

CLR 프로파일 러는 관리되지 않는 메모리를 표시하지 않습니다. 프로세스 자체와 런타임은 메모리를 사용합니다. http://adwords.google.com/support/bin/answer.py?hl=ko&hl=ko 메모리가 어떻게 사용되는지 자세히 알아 보려면 http://blogs.msdn.com/b/maoni/archive/2004/11/08/tools-that-help-diagnose-managed-memory-related-issues.aspx를 사용하십시오. techne/sysinternals의 briljant 프로세스 탐색기를 사용하거나 사용하십시오. http://technet.microsoft.com/en-us/sysinternals/bb896653 – rene

+1

왜 그런 사용량이 적어 메모리 오류가 발생합니까? 아마도 귀하의 문제는 실제로 메모리 손상입니다. –

+0

다른 프로파일 러를 살펴 보겠습니다. 감사합니다. 앱이 실행되는 플랫폼은 512MB의 메모리 만있는 소형 패널 PC입니다. 또한 플래시 기반 하드 드라이브이기 때문에 페이징이 비활성화됩니다.동시에 실행되는 다른 앱이 있으므로 메모리 사용을 완전히 이해하려고합니다. – BabaBooey

답변

8

여기에 제안 된 진단 도구 중 일부를 사용하고 ANTS memory profiler (돈이 너무 큼)을 사용하여 누수의 원인을 발견했습니다.

  1. WPF Storyboard animations leak under .NET 3.5
  2. WPF BitmapEffect 사용 클래스는 누수가 발생할 수 있습니다. 대체 "효과"클래스는 누수를 수정합니다. Link, Link
  3. XAML 병합 된 ResourceDictionaries는 누출의 원인이 될 수 있습니다. LinkLink
  4. 응용 프로그램 (작업 관리자가 표시하는 메모리)의 "작업 세트"메모리 영역은 프로세스의 공간을 잘 나타내지 않습니다. 외부 응용 프로그램이이 기능에 영향을 줄 수 있습니다. Link

메모리 프로파일 링 도구를 사용하여 누수가 대부분 관리되지 않는 코드로되어있어 추적하기가 정말 어려웠습니다. 이러한 누출을 처리하고 Windows 메모리 (개인용 대 작업 세트)를 더 잘 이해하면 문제가 해결됩니다.

관련 문제