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ó↩