Ideális esetben nincs szükség arra, hogy a szemétgyűjtőt manuálisan aktiváljuk az alkalmazásunk életciklusa során, mert a keretrendszer egészen jól tudja optimalizálni, hogy mikor van erre szükség. Azonban ezen optimalizációk miatt nem determinisztikus1, hogy mikor is fog ez megtörténni.
Éppen ezért egy nagyon nagy alkalmazás során lehet optimalizálni a sebességet és a memória használatot egy-egy manuálisan kiváltott szemétgyűjtés segÃtségével.
Ugyanakkor megjegyzem, ha rossz helyen, esetlegesen túl sűrűn történik a szemétgyűjtÅ‘ aktiválása, akkor az negatÃv hatással lehet a programunk memória használatára és sebességére.
A szemétgyűjtő működését a GC statikus osztályon keresztül tudjuk befolyásolni. Az osztály legfontosabb metódusai és tulajdonságai:
GC.Collect();
Aktiválja a szemétgyűjtőt 2. generációs limittel, vagyis minden generáción végigmegy.
GC.Collect(int generation);
Aktiválja a szemétgyűjtÅ‘t a megadott generáción. A generáció értéke 0, 1, 2 lehet. EllenkezÅ‘ esetben a metódus hÃvásakor ArgumentOutOfRangeException kivétel fog keletkezni.
GC.Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting);
Aktiválja a szemétgyűjtőt a megadott generáción. A mode argumentum a szemétgyűjtés módját befolyásolja. Ez a következő három értéket veheti fel: Default, Forced, Optimized
A Default és Forced jelentése jelenleg azonos. Optimized mód esetén a szemétgyűjtés csak akkor fog lefutni, ha a szemétgyűjtő szerint optimálisak a körülmények.
Ha blocking paraméter igaz, akkor a hÃvó szálat várakoztatja, amÃg fut, ellenkezÅ‘ esetben a háttérben fog futni.
Ha a compacting paraméter igaz, akkor a futás után egy töredezettségmentesÃtés fog következni. Ha igaz értékű, akkor blocking paraméter hamis értéke esetén is blokkolva lesz a hÃvó szál végrehajtása.
long GC.GetTotalMemory(bool forceFullCollection);
Visszaadja a jelenleg lefoglalt memóriát byte-ban. Ha a paramétere igaz, akkor a metódus visszatérés előtt lefuttatja a szemétgyűjtést.
GC.SuppressFinalize(object obj);
Arra utasÃtja a szemétgyűjtÅ‘t, hogy az objektum felszabadÃtása elÅ‘tt ne hÃvja meg annak Finalizer metódusát. Tipikusan IDisposable felületet implementáló objektumok esetén használt.
GC.WaitForPendingFinalizers ();
Blokkolja a hÃvó szál végrehajtását addig, amÃg a szemétgyűjtÅ‘ nem végzett teljesen a Finalizerek végrehajtásával és a szemétgyűjtÅ‘ssel.
-
ElÅ‘re meg nem jósolható↩