Útmutató a szemétgyűjtéshez a programozásban

Mi az a szemétgyűjtés?

Általános szakemberek szerint a Szemétgyűjtés (GC) nem más, mint az objektumokhoz rendelt memória összegyűjtése vagy visszakeresése, amely azonban a programunk egyetlen részében sem használatos.

Nézzük részletesebben. A szemétgyűjtés az a folyamat, amelyben a programok megpróbálnak felszabadítani olyan memóriaterületet, amelyet az objektumok már nem használnak.

A szemétszállítás minden nyelven más és más. A legtöbb magas szintű programozási nyelv beépített valamilyen szemétgyűjtést. Az alacsony szintű programozási nyelvek hozzáadhatják a szemétszedést a könyvtárakon keresztül.

Mint fentebb említettük, minden programozási nyelvnek megvan a maga módja a GC végrehajtására. A C programozásban a fejlesztőknek gondoskodniuk kell a memória allokációjáról és a deallocation-ről a malloc () és a dealloc () függvények használatával. De a C # fejlesztőknek nem kell gondoskodniuk a GC-ről, és ez sem ajánlott.

Hogyan történik a memória allokációja?

A C # -ban az objektumok memória-allokációja egy felügyelt kupacban történik, amelyet a CLR (köznyelv futásideje) gondoz. A halom memóriájának lefoglalása az operációs rendszer Win32 dll-jén és hasonlóan C-n keresztül történik.

De a C-ben az objektumok a memóriába kerülnek, bárhol van szabad hely, amely megfelel az objektum méretének. Emellett a memória feltérképezése a Linkedlist koncepciók alapján működik. A C # -ban a halom memória-allokációja lineáris módon, egymás után történik.

Amikor új objektum jön létre, a memória lefoglalásra kerül a kupacban, és a mutató a következő memória címre kerül. A C # memória-allokáció gyorsabb, mint a C-ben. Ez azért van, mert C-ben a memóriának meg kell keresnie és lefoglalnia az objektumot. Tehát valamivel több időbe telik, mint a C #.

Generációk C # GC-ben

A .net programozásban a halomnak három generációja van, az úgynevezett 0, 1 és 2 generáció. A 0. generáció először töltődik be, amikor új objektum jön létre. Ezután a szemétgyűjtő fut, amikor a 0. generáció kitöltődik. Az újonnan létrehozott objektumok a 0. generációba kerülnek.

A szemétszállítás során az összes nem kívánt tárgy megsemmisül, így felszabadul és tömörödik a memória. A GC gondoskodik a felszabadult memória mutatóinak mutatásáról, amint a GC megtörténik.

Az 1. és a 2. generáció hosszabb élettartamú objektumokat tartalmaz. Az 1. és 2. generáció GC-je csak akkor fog megtörténni, ha a 0. generációnak elegendő memóriája van a lefoglaláshoz.

Nem szabad programszerűen hivatkozni a GC-re. Jó hagyni, hogy ez magától megtörténjen. A GC mindig hívást kap, amikor a 0. generáció megtelt.

A GC előnyei és hátrányai

A szemétgyűjtés egy olyan eszköz, amely időt takarít meg a programozók számára. Például helyettesíti a C-ben található funkciók, például a malloc () és a free () szükségességét. Segíthet a memóriaszivárgások megelőzésében is.

A szemétszállítás hátránya, hogy negatív hatással van a teljesítményre. A GC-nek rendszeresen futtatnia kell a programot, ellenőriznie kell az objektum hivatkozásokat és ki kell takarítania a memóriát. Ez erőforrásokat igényel, és gyakran megköveteli a program szüneteltetését.

Mikor kell csinálni

Ha egy objektumnak nincs referenciája (már nem érhető el), akkor jogosult a szemétszállításra.

Például az alábbi Java-kódban a Thing objektumra, amelyre eredetileg a 'thing1' hivatkozik, egyetlen és egyetlen hivatkozása van átirányítva a halom másik objektumára. Ez azt jelenti, hogy akkor elérhetetlen, és memóriáját a szemétgyűjtő nem osztja fel.

class Useless { public static void main (String[] args) { Thing thing1 = new Thing(); Thing thing2 = new Thing(); thing2 = thing1; // direct thing2's reference towards thing1 // no references access thing2 } }

A szemétszedés egyik példája az ARC, az automatikus referenciaszámlálás rövidítése. Ezt például a Swift-ben használják. Az ARC nyomon követi az összes létrehozott objektum hivatkozásait. Ha a referenciák száma 0-ra csökken, akkor az objektum megjelölésre kerül az elosztáshoz.

Több információ:

  • //docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - További információ a szemétszállításról