Programování
Garbage collector
Garbage collector (neboli sběratel) se pokouší vyhledat úseky paměti, které jsou obsazeny nepoužívanými „odpadky“,
které už dále programem nejsou využívány.
Tyto úseky paměti jsou poté uvolňovány pro další použití.
V starších programovacích jazycích, jako je C a C++, musí vývojář ručně odstraňovat objekty a uvolňovat paměť. Spoléhání na manuální procesy mohlo snadno vést k chybám v kódu, z nichž některé mohou mít vážné následky .
Memory leak (únik paměti) je situace, kdy program nesprávně spravuje alokace paměti tak, že paměť, která již není potřebná, není uvolněna. K úniku paměti může dojít také tehdy, když je objekt uložen v paměti, ale kód, který běží, na něj nemá přístup (tj. nepřístupná paměť) 2.
V starších programovacích jazycích, jako je C a C++, musí vývojář ručně odstraňovat objekty a uvolňovat paměť. Spoléhání na manuální procesy mohlo snadno vést k chybám v kódu, z nichž některé mohou mít vážné následky .
Memory leak (únik paměti) je situace, kdy program nesprávně spravuje alokace paměti tak, že paměť, která již není potřebná, není uvolněna. K úniku paměti může dojít také tehdy, když je objekt uložen v paměti, ale kód, který běží, na něj nemá přístup (tj. nepřístupná paměť) 2.
Metoda reference counter (počítání referencí)
Tato metoda sleduje, kolik odkazů (referencí) existuje na každý objekt v paměti.
Každý objekt má počítadlo referencí , které se inkrementuje, když se na něj vytvoří nový odkaz, a dekrementuje, když odkaz zanikne (např. když proměnná přestane ukazovat na objekt).
Když počet referencí klesne na nulu, objekt je považován za nepotřebný a může být uvolněn. Tato metoda je jednoduchá, ale má problémy s cyklickými referencemi (když se objekty navzájem odkazují).
Každý objekt má počítadlo referencí , které se inkrementuje, když se na něj vytvoří nový odkaz, a dekrementuje, když odkaz zanikne (např. když proměnná přestane ukazovat na objekt).
Když počet referencí klesne na nulu, objekt je považován za nepotřebný a může být uvolněn. Tato metoda je jednoduchá, ale má problémy s cyklickými referencemi (když se objekty navzájem odkazují).
Metoda mark-and-sweep (označení a vyčištění)
Tato metoda je jedním z algoritmů pro sběr odpadu.
Proces probíhá ve dvou fázích:
Procházíme graf a označujeme všechny dosažitelné objekty.
Kořenový objekt (objekt přístupný přímo z lokální proměnné) slouží jako vstupní bod pro procházení grafu.
Objekty, které nejsou označeny jako dosažitelné, jsou uvolněny (jejich paměť je uvolněna).
Označení dosažitelných objektů se resetuje, aby byly připraveny pro další sběr odpadu.
V rámci sběru odpadu se paměť často dělí do několika generací.
Vzhledem k tomu, že procházíme všechny objekty, program zamrzne a stává se pomalým, opoti Reference counteru
Výhodou metody mark-and-sweep je, že se vyrovná i s cyklickými referencemi, aniž by upadla do nekonečné smyčky 1. Je to však pouze jedna z mnoha metod sběru odpadu, které se používají k efektivnímu uvolňování paměti v programovacích jazycích.
Proces probíhá ve dvou fázích:
Fáze označení (Mark)
Vytvoříme graf všech dosažitelných objektů (objektů, na které program může odkazovat).Procházíme graf a označujeme všechny dosažitelné objekty.
Kořenový objekt (objekt přístupný přímo z lokální proměnné) slouží jako vstupní bod pro procházení grafu.
Fáze vyčištění (Sweep)
Procházíme všechny objekty v paměti.Objekty, které nejsou označeny jako dosažitelné, jsou uvolněny (jejich paměť je uvolněna).
Označení dosažitelných objektů se resetuje, aby byly připraveny pro další sběr odpadu.
V rámci sběru odpadu se paměť často dělí do několika generací.
Vzhledem k tomu, že procházíme všechny objekty, program zamrzne a stává se pomalým, opoti Reference counteru
Výhodou metody mark-and-sweep je, že se vyrovná i s cyklickými referencemi, aniž by upadla do nekonečné smyčky 1. Je to však pouze jedna z mnoha metod sběru odpadu, které se používají k efektivnímu uvolňování paměti v programovacích jazycích.
Více informací: geeksforgeeks
c# a Garbage collector
všechno funguje automaticky, nemusíme se o nic starat.
Všechno běží v pozadí a uvolňuje paměť, kterou už nepotřebujeme.
Není potřeba vědět více, ovšem nějaký kusy kódu můžeme napsat, abychom zjistili, kolik paměti je využito.
V okně Diagnostic tools se bude objevova žlutý pruh GC, který nám ukáže, že paměť je zahlcena a GC zasáhl a vyčistil jí.
Všechno běží v pozadí a uvolňuje paměť, kterou už nepotřebujeme.
Není potřeba vědět více, ovšem nějaký kusy kódu můžeme napsat, abychom zjistili, kolik paměti je využito.
Zjišťování paměti
public static void Main(string[] args)
{
// Maxinalní vytvořená generace
Console.WriteLine("The number of generations are: "
+ GC.MaxGeneration);
// Vypíše kolik paměti je využito
Console.WriteLine("Total Memory:"
+ GC.GetTotalMemory(false));
// Vytvoří objekt
Demo obj = new Demo();
// Vypíše generaci objektu
Console.WriteLine(
"The generation number of object obj is: "
+ GC.GetGeneration(obj));
// Vypíše kolik paměti je využito
Console.WriteLine("Total Memory:"
+ GC.GetTotalMemory(false));
}
Output:
The number of generations are: 2
Total Memory: 4197120
The generation number of object obj is: 0
Total Memory: 4204024
Záměrné zahlcení paměti
public static void Main(string[] args)
{
for (int i = 0; i < 1000000000000000; i++)
{
var obj = new object();
}
}
V okně Diagnostic tools se bude objevova žlutý pruh GC, který nám ukáže, že paměť je zahlcena a GC zasáhl a vyčistil jí.
Zdroje: