lip/090
[.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:
- 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)
- 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
Brak komentarzy.
Przepraszam, dodawanie komentarzy zablokowane.
Brak trackbacków.