I was wondering if anyone had any tips to reduce the memory usage of .NET applications. Consider the following simple C# program:
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Compiled in release mode for x64 and running outside visual studio, the task manager reports the following:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
It's a little better if it's compiled just for x86:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
I then tried the following program, which does the same but tries to trim process size after runtime initialization:
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);
}
The results on x86 Release outside Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Which is a little better, but still seems excessive for such a simple program. Does anyone know any tricks to make a C# process a bit leaner? I'm writing a program that's designed to run in the background most of the time. I'm already doing any user interface stuff in a separate application domain which means the user interface stuff can be safely unloaded, but taking up 10 MB when it's just sitting in the background seems excessive.
P.S. As to why I would care --- (Power) users tend to worry about these things. Even if it has nearly no effect on performance, semi-tech-savvy users (my target audience) tend to go into hissy fits about background application memory usage. Even I freak when I see Adobe Updater taking 11 MB of memory and feel soothed by the calming touch of Foobar2000, which can take under 6 MB even when playing. I know in modern operating systems, this stuff really doesn't matter that much technically, but that doesn't mean it doesn't have an affect on perception.