2011-12-09 4 views
1

내 응용 프로그램은 .NET 4.0 및 WinForm을 실행 중입니다.내 응용 프로그램에서 가상 메모리 (커밋) 크기를 줄일 수 있습니까?

Mdi 응용 프로그램 및 타사 컨트롤이 사용되었습니다.

실행 중일 때 점점 가상 메모리 (커밋) 크기가 커집니다. 나는 줄이고 그것은 잘 작동과 같은 라인

GC.Collect(GC.MaxGeneration); 
GC.WaitForPendingFinalizers(); 
SetProcessWorkingSetSize(p.Handle, -1, -1); 

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] 
public static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize); 

과은 WorkingSet 크기를 해제 할 수있다. 글쎄, 몇 가지 화면이 비즈니스 로직을 위해 열려 있어야하므로 메모리 크기가 계속 증가하고 있고, 결국 앱이 죽어 가고 있습니다.

그러나 가상 메모리 크기를 줄이거 나 출시 할 수 없었습니다.

나는의 app.config 그것은 작동하지 않습니다

<runtime> 
<DisableDoubleMapping enabled="true" /> 
<gcTrimCommitOnLowMemory enabled="true"/> 
</runtime> 

에서 구성을 시도했다. 그것에 영향을줍니다.

VMMap 3.1에서 보려고했습니다. 이미지는 주로 .net ngen 이미지입니다. 어셈블리의 일부와 추가 참조 dll이 그렇게 크지는 않습니다. 물론 dll (winform을위한 세 번째 pary 컨트롤)은 약 5 ~ 6MB입니다.

내 응용 프로그램에서 가상 메모리 (커밋) 크기를 줄일 수있는 방법은 무엇입니까?

가능한 한 빨리 알려주십시오. 이와 비슷한

SetProcessWorkingSetSize(p.Handle, -1, -1); 

감사합니다.

+0

마술 지팡이가 없으므로 더 똑똑한 코드를 작성해야합니다. 작업 세트 크기를 줄이는 것은 의미가 없습니다. –

답변

1

먼저 메모리가 커지는 원인을 찾아야합니다. 닷넷 메모리 프로파일 러는 시간이 지남에 따라 스냅 샷을 찍어 서로 비교할 수있는 좋은 도구입니다. 어떤 객체가 "새는가"를 볼 수 있으며 해당 객체에 대한 & 루트 스택을 할당하므로 코드를 수정하여 참조를 해제 할 수 있습니다.

app.config 파일의 DisableDoubleMapping은 .Net 4.에서는 유용하지 않습니다. .NET Framework 3.5의 버그로 인해 어셈블리가 메모리에 두 번로드되는 문제의 해결 방법으로 추가되었습니다. Microsoft's hotfix page for KB981266에서 자세한 내용을 볼 수 있습니다.

관련 문제