.NET 애플리케이션의 메모리 사용량을 줄이기위한 몇 가지 팁은 무엇입니까? 다음과 같은 간단한 C # 프로그램을 고려하십시오.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
x64 용 릴리스 모드 에서 컴파일되고 Visual Studio 외부에서 실행되는 작업 관리자는 다음을보고합니다.
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
x86 전용으로 컴파일하면 조금 더 좋습니다 .
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
그런 다음 동일한 작업을 수행하지만 런타임 초기화 후 프로세스 크기를 줄이려고하는 다음 프로그램을 시도했습니다.
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Visual Studio 외부의 x86 릴리스 에 대한 결과 :
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
조금 더 좋지만 그런 간단한 프로그램에는 여전히 과도하게 보입니다. C # 프로세스를 좀 더 간결하게 만드는 트릭이 있습니까? 저는 대부분의 경우 백그라운드에서 실행되도록 설계된 프로그램을 작성하고 있습니다. 이미 별도의 응용 프로그램 도메인 에서 사용자 인터페이스 작업을 수행하고 있습니다. 즉, 사용자 인터페이스 항목을 안전하게 언로드 할 수 있지만 백그라운드에있을 때 10MB를 차지하는 것은 과도하게 보입니다.
추신 : 내가 관심을 갖는 이유에 대해 --- (파워) 사용자는 이러한 것들에 대해 걱정하는 경향이 있습니다. 성능에 거의 영향을 미치지 않더라도 기술에 정통한 사용자 (내 타겟 청중)는 백그라운드 애플리케이션 메모리 사용에 대해 쉿쉿하는 경향이 있습니다. 어도비 업데이터가 11MB의 메모리를 차지하는 것을보고 놀랐을 때도 6MB 미만의 메모리를 차지할 수있는 Foobar2000의 차분한 터치에 마음이 편안해졌습니다. 나는 현대의 운영체제에서 이런 것들이 기술적으로 그다지 중요하지 않다는 것을 알고 있지만 그것이 인식에 영향을 미치지 않는다는 의미는 아닙니다.