Garbage collector (GC) je správce paměti. Mnoho programovacích jazyků má vestavěný GC. Tato funkce automaticky přiděluje a uvolňuje paměť v programu. Uvolňuje vázanou nevyužitou paměť, která zpomaluje vaši aplikaci.

Krása GC spočívá v tom, že uvolňuje paměť vaším jménem, ​​aniž byste museli cokoli dělat. Můžete to tedy považovat za tak zásadní funkci, že byste očekávali, že ji bude mít každý programovací jazyk. Bohužel tomu tak není; dokonce i populární jazyk jako C může postrádat GC.

Jak funguje alokace paměti?

Když spustíte program v jakémkoli programovacím jazyce, váš operační systém si vyhrazuje a datový zásobník v paměti pro ten program. Tento program vlastní a zabírá tento zásobník dat, dokud nedokončí provádění. Pokud váš program potřebuje více paměti, než kolik je k dispozici, může dynamicky přidělit více paměti z haldy paměti operačního systému.

V programování proměnná představuje místo v paměti. Takže když deklarujete novou proměnnou, programovací jazyk přidělí této proměnné místo v paměti. Proměnná bude mít nyní adresu paměti. Dokud této proměnné nepřiřadíte hodnotu, zůstane neinicializovaná a může obsahovat nějakou nesmyslnou hodnotu.

instagram viewer

Pokud vám programovací jazyk umožňuje deklarovat proměnnou bez její inicializace, pak se jedná o dynamickou proměnnou. To znamená, že hodnota, kterou proměnné přiřadíte, se může časem změnit. Paměťové umístění proměnné však zůstane stejné, dokud ji neuvolníte.

Jak funguje přidělení paměti?

Alokace paměti je podobný proces pro všechny programovací jazyky. Ale odpovídající metoda dealokace paměti má tendenci se lišit. Existují dva typy metod dealokace paměti; manuální a automatické. GC provádí automatickou dealokaci.

Rozdělení paměti bez sběrače odpadků

The C programovací jazyk nepoužívá GC pro dealokaci paměti. Proto musí programátoři C ručně alokovat a uvolnit paměť. C umožňuje dynamické přidělování paměti, když v době kompilace nevíte, kolik paměti za běhu použijete.

Standardní knihovna (stdlib.h) obsahuje funkce, které jazyk C používá ke správě dynamické alokace paměti. Mezi tyto funkce patří:

  • malloc(): přiděluje konkrétní velikost paměti a vrací ukazatel na tuto paměť. Pokud není ve fondu paměti operačního systému k dispozici dostatek paměti, vrátí hodnotu null.
  • free(): uvolní konkrétní blok paměti a vrátí jej do oblasti paměti operačního systému.

C Příklad programu

#zahrnout
#zahrnout

inthlavní()
{
int *ptr; // deklarovat ukazatel
int j; // deklarovat čítač

// alokuje prostor pro 200 celých čísel
ptr = (int *) malloc(200 * velikost(int));

// vloží celočíselné hodnoty do přidělené paměti
// a vytiskne každou hodnotu do konzole
pro (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// uvolní dříve přidělenou paměť
volný, uvolnit(ptr);
vrátit se0;
}

Výše uvedený kód alokuje paměť pro uložení 200 celočíselných hodnot pomocí malloc() funkce. Pro přístup k tomuto paměťovému místu používá ukazatel a ukládá do něj 200 celočíselných hodnot. Ukazatel také vytiskne data uložená v místě paměti do konzoly. Nakonec program uvolní dříve přidělenou paměť pomocí volný, uvolnit() funkce.

Rozdělení paměti pomocí sběrače odpadků

Několik populárních programovacích jazyků používá GC pro správu paměti. To značně usnadňuje život programátorům, kteří tyto jazyky používají. C# a Java jsou dva programovací jazyky, které používají GC.

C# GC

V programovací jazyk C#GC spravuje alokaci a dealokaci adres paměti. Programátor C# se proto nemusí starat o uvolnění objektu poté, co splní svůj účel.

C# GC inicializuje paměťový fond, nazývaný spravovaná halda, pro každý nový proces (nebo program). Volá to VirtualAlloc() funkce pro alokaci paměti a VirtualFree() funkci pro jeho uvolnění. Nejlepší na tom je, že se to vše děje na pozadí, aniž byste museli vy, programátor, vynakládat žádné úsilí.

C# GC má optimalizační engine, který používá k rozhodování, kdy uvolnit paměť. Optimalizační modul zkoumá kořen aplikace, aby zjistil, které objekty se již nepoužívají. Dělá to vytvořením grafu, který sahá od kořenového adresáře aplikace k připojeným objektům. Tento kořen zahrnuje statická pole, lokální proměnné atd. Jakýkoli objekt, který není připojen ke kořenovému adresáři aplikace, je odpad.

Optimalizační engine GC nesbírá pouze paměť sám o sobě. Nejprve musí existovat nový požadavek na přidělení paměti. Pokud má systém málo dostupné paměti, do hry vstoupí optimalizační engine GC.

Java GC

V Javě GC také spravuje alokaci a dealokaci adres paměti. Java má však v současnosti čtyři různé typy podporovaných garbage collectorů:

  • Garbage-First (G1)
  • Seriál
  • Paralelní
  • Z Garbage Collector (ZGC)

G1 garbage collector je výchozí GC Java od vydání Java Development Kit (JDK) 9. Java organizuje data v objektech a ukládá tyto objekty do haldy pevné velikosti. G1 garbage collector rozděluje haldu na stejně velké oblasti haldy. Potom rozdělil tyto oblasti haldy na dvě části; mladé i staré generace.

Pokaždé, když vytvoříte nový objekt, dojde u mladé generace k přidělení prostoru pro tento objekt. Pomocí procesu stárnutí zkopíruje sběrač odpadu G1 objekty v mladých oblastech do starých oblastí. Kopíruje také objekty, které jsou již ve starém regionu, do staršího regionu.

G1 garbage collector pak většinu své paměti dealokuje u mladé generace, občas se odváží do sekce staré generace.

Jaké jsou výhody sběrače odpadu?

Výhodou garbage collectoru je, že vám zabrání přemýšlet o správě paměti při psaní kódu. Získáte tak čas soustředit se na další důležité aspekty vaší aplikace. Za zmínku však stojí několik dalších výhod.

Obnovení nepoužívaných objektů a uvolnění paměti zajišťuje čistší provádění aplikací. Pokud váš program uvolní paměť co nejdříve, bude mít menší nároky na paměť a může běžet efektivněji.

Shromažďování odpadků snižuje chyby související se správou paměti, jako jsou netěsnosti a chyby ukazatelů. Je to proto, že proces již není závislý na programátorovi a jeho schopnosti psát přesný kód.