Garbage collector (GC) je správca pamäte. Mnoho programovacích jazykov má vstavaný GC. Táto funkcia automaticky prideľuje a uvoľňuje pamäť v programe. Uvoľňuje zviazanú, nepoužívanú pamäť, ktorá spomaľuje vašu aplikáciu.
Krása GC je v tom, že uvoľňuje pamäť vo vašom mene bez toho, aby ste museli čokoľvek robiť. Preto by ste to mohli považovať za takú zásadnú vlastnosť, že by ste očakávali, že ju bude mať každý programovací jazyk. Žiaľ, nie je to tak; dokonca aj populárny jazyk ako C môže chýbať GC.
Ako funguje alokácia pamäte?
Keď spustíte program v akomkoľvek programovacom jazyku, váš operačný systém si vyhradzuje a zásobník dát v pamäti pre ten program. Tento program vlastní a zaberá tento zásobník údajov, kým nedokončí vykonávanie. Ak váš program potrebuje viac pamäte, ako je k dispozícii, môže dynamicky prideliť viac pamäte z haldy pamäte operačného systému.
V programovaní premenná predstavuje miesto v pamäti. Takže, keď deklarujete novú premennú, programovací jazyk pridelí priestor v pamäti pre túto premennú. Premenná bude mať teraz adresu pamäte. Kým tejto premennej nepriradíte hodnotu, zostane neinicializovaná a môže obsahovať nejakú hodnotu odpadu.
Ak vám programovací jazyk umožňuje deklarovať premennú bez jej inicializácie, ide o dynamickú premennú. To znamená, že hodnota, ktorú priradíte premennej, sa môže časom meniť. Pamäťové umiestnenie premennej však zostane rovnaké, kým ju neuvoľníte.
Ako funguje prideľovanie pamäte?
Prideľovanie pamäte je podobný proces pre všetky programovacie jazyky. Ale zodpovedajúca metóda uvoľnenia pamäte má tendenciu sa líšiť. Existujú dva typy metód uvoľnenia pamäte; manuálna a automatická. GC vykonáva automatickú dealokáciu.
Rozdelenie pamäte bez zberača odpadu
The C programovací jazyk nepoužíva GC na uvoľnenie pamäte. Preto musia programátori v jazyku C manuálne prideľovať a uvoľňovať pamäť. C umožňuje dynamickú alokáciu pamäte, keď v čase kompilácie neviete, koľko pamäte použijete v čase spustenia.
Štandardná knižnica (stdlib.h) obsahuje funkcie, ktoré C používa na riadenie dynamickej alokácie pamäte. Tieto funkcie zahŕňajú:
- malloc(): pridelí špecifickú veľkosť pamäte a vráti ukazovateľ na túto pamäť. Ak v pamäťovej oblasti operačného systému nie je dostatok pamäte, vráti hodnotu null.
- free(): uvoľní konkrétny blok pamäte a vráti ho do oblasti pamäte operačného systému.
C Príklad programu
#zahŕňajú
#zahŕňajúinthlavné()
{
int *ptr; // vyhlásenie ukazovateľa
int j; // vyhlásenie počítadla// pridelí priestor pre 200 celých čísel
ptr = (int *) malloc(200 * veľkosť(int));// vloženie celočíselných hodnôt do pridelenej pamäte
// a vypíše každú hodnotu do konzoly
pre (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}
// uvoľnenie predtým pridelenej pamäte
zadarmo(ptr);
vrátiť0;
}
Vyššie uvedený kód prideľuje pamäť na uloženie 200 celočíselných hodnôt pomocou malloc() funkciu. Na prístup k tomuto miestu pamäte používa ukazovateľ a ukladá doň 200 celočíselných hodnôt. Ukazovateľ tiež vytlačí údaje uložené na pamäťovom mieste do konzoly. Nakoniec program uvoľní predtým pridelenú pamäť pomocou zadarmo() funkciu.
Rozdelenie pamäte pomocou zberača odpadu
Niekoľko populárnych programovacích jazykov používa GC na správu pamäte. To značne uľahčuje život programátorom, ktorí tieto jazyky používajú. C# a Java sú dva programovacie jazyky, ktoré používajú GC.
C# GC
V programovací jazyk C#GC riadi prideľovanie a rozdeľovanie pamäťových adries. Preto sa programátor v C# nemusí starať o uvoľnenie objektu po tom, čo splní svoj účel.
C# GC inicializuje pamäťovú oblasť, nazývanú riadená halda, pre každý nový proces (alebo program). Volá to VirtualAlloc() funkcia na pridelenie pamäte a VirtualFree() funkciu na jeho uvoľnenie. Najlepšie na tom je, že sa to všetko deje na pozadí bez akéhokoľvek úsilia od vás, programátora.
C# GC má optimalizačný engine, ktorý používa na rozhodnutie, kedy uvoľniť pamäť. Optimalizačný mechanizmus skúma koreň aplikácie, aby určil, ktoré objekty sa už nepoužívajú. Robí to vytvorením grafu, ktorý siaha od koreňového adresára aplikácie až po pripojené objekty. Tento koreň zahŕňa statické polia, lokálne premenné atď. Akýkoľvek objekt, ktorý nie je pripojený ku koreňu aplikácie, je odpad.
Optimalizačný engine GC nezhromažďuje pamäť len sám o sebe. Najprv musí existovať nová požiadavka na pridelenie pamäte. Ak má systém málo dostupnej pamäte, do hry vstúpi optimalizačný engine GC.
Java GC
V jazyku Java riadi GC aj prideľovanie a rozdeľovanie adries pamäte. Java má však v súčasnosti štyri rôzne typy podporovaných zberačov odpadu:
- Garbage-First (G1)
- Serial
- Paralelné
- Z Garbage Collector (ZGC)
G1 garbage collector je predvolený GC Java od vydania Java Development Kit (JDK) 9. Java organizuje údaje v objektoch a ukladá tieto objekty do haldy s pevnou veľkosťou. Zberač odpadu G1 rozdeľuje haldu na rovnako veľké oblasti haldy. Potom rozdelil tieto oblasti haldy na dve časti; mladú a starú generáciu.
Zakaždým, keď vytvoríte nový objekt, pridelenie priestoru pre tento objekt sa stane v mladej generácii. Pomocou procesu starnutia zberač odpadu G1 kopíruje objekty v mladých regiónoch do starých regiónov. Do staršieho kraja kopíruje aj predmety, ktoré sú už v starom kraji.
G1 garbage collector potom väčšinu svojej pamäte rozdelí v mladej generácii, príležitostne sa odváži do sekcie starej generácie.
Aké sú výhody zberača odpadu?
Výhodou zberača odpadu je, že vám bráni premýšľať o správe pamäte počas písania kódu. Získate tak čas sústrediť sa na ostatné dôležité aspekty vašej aplikácie. Za vyzdvihnutie však stojí niekoľko ďalších výhod.
Obnovenie nepoužívaných objektov a uvoľnenie pamäte poskytuje čistejšie vykonávanie aplikácií. Ak váš program uvoľní pamäť čo najskôr, bude mať menšie nároky na pamäť a môže bežať efektívnejšie.
Zhromažďovanie odpadu znižuje chyby súvisiace so správou pamäte, ako sú netesnosti a chyby ukazovateľov. Je to preto, že proces už nie je závislý od programátora a jeho schopnosti napísať presný kód.