13
lip/09
0

[.NET] Zwalnianie nadmiarowej pamięci zaalokowanej przez CLR

Poniżej przedstawiony kawałek kodu osobiście uważam za „Świętego Grala” .NET, chociaż pochodzi prosto z WinApi. Umożliwia wymuszenie na aplikacji napisanej w .NET na zwolnienie za alokowanej pamięci w której aktualnie nie przechowuje obiektów.

.NET wykonując swoje programy zawsze alokuje więcej pamięci niż potrzebuje, gdyż polityka kompilatora zakłada że proces alokowania pamięci jest czasochłonny. Faktycznie tak jest, jednak w zależności od sytuacji ta czasochłonność może nie być zauważona. Wielu użytkowników panicznie interpretuje zapisy w Menedżerze zadań (taskmgr.exe) w którym to zwykła aplikacja posiadająca pojedynczą formatkę i przycisk zajmuje 11MB pamięci. Wskazanie to jest nieprawidłowe, jednak w tej chwili nie będę wdawał się w szczegóły, poza krótkim stwierdzeniem, że obiekty aplikacji zajmują mniej pamięci, a znaczna większość z tych 11MB to za alokowana przestrzeń pamięci dla aplikacji, która pozostaje pusta (a można ją zwrócić do systemu).

Do zalet stosowania poniższej funkcji dotychczas mogę zaliczyć dwie rzeczy:

  1. Możliwość pisania aplikacji rezydentnych w .NET (aplikacja co jakiś wywołuje zwolnienie pamięci, przez co jest w stanie zminimalizowanym może zajmować nawet 500KB)
  2. Możliwość uniknięcia wyjątku „OutOfMemoryException”, który jest generowany na podstawie wiadomości wysyłanej przez system operacyjny do wszystkich aplikacji, gdy ilość pamięci spadnie do 32MB (Sprawdzone w kodzie produkcyjnym).
using System.Runtime.InteropServices;
//(....)

[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);

public void CutRamUsage()
{
GC.Collect();
GC.WaitForPendingFinalizers();

if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}

Więcej informacji pod adresem:
http://msdn.microsoft.com/en-us/library/ms686234(VS.85).aspx

Komentarze (0) Trackbacks (0)

Brak komentarzy.

Przepraszam, dodawanie komentarzy zablokowane.

Brak trackbacków.