Zmniejszenie wykorzystania pamięci przez aplikacje .NET?
Jakie są wskazówki dotyczące zmniejszenia wykorzystania pamięci przez aplikacje .NET? Rozważmy następujący prosty program C #.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Wbudowanywydanie tryb dlax64 i działając poza Visual Studio, menedżer zadań zgłasza następujące informacje:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Jest trochę lepiej, jeśli jest skompilowany tylko dlax86:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Następnie wypróbowałem następujący program, który robi to samo, ale próbuje przyciąć rozmiar procesu po inicjalizacji w czasie wykonywania:
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);
}
Wyniki nax86 Wydanie poza Visual Studio:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
Co jest trochę lepsze, ale nadal wydaje się przesadne w przypadku tak prostego programu. Czy są jakieś sztuczki, aby proces C # był nieco szczuplejszy? Piszę program, który przez większość czasu działa w tle. Robię już wszystkie elementy interfejsu użytkownika w osobnymDomena aplikacji co oznacza, że elementy interfejsu użytkownika mogą być bezpiecznie wyładowane, ale zajmowanie 10 MB, gdy tylko siedzi w tle, wydaje się nadmierne.
P.S. Jeśli chodzi o to, dlaczego miałbym się tym przejmować - użytkownicy (Power) zwykle martwią się o te rzeczy. Nawet jeśli nie ma to prawie żadnego wpływu na wydajność, użytkownicy znający się na pół-techach (moi odbiorcy docelowi) zwykle wpadają w szał na temat użycia pamięci w tle aplikacji. Nawet dziwię się, gdy widzę Adobe Updater pobierający 11 MB pamięci i uspokajający uspokajającym dotykiem Foobar2000, który może zabrać nawet 6 MB nawet podczas grania. Wiem w nowoczesnych systemach operacyjnych, że to naprawdę nie ma znaczenia technicznie, ale to nie znaczy, że nie ma wpływu na percepcję.