Senior
Jak dochází k rozdělení objektů v haldách?
sobes.tech AI
Odpověď od AI
V .NET je halda (heap) rozdělena do dvou hlavních generací: Generace 0 a Generace 1. Pokud je potřeba, je vytvořena Generace 2.
- Generace 0 (Gen 0): Nově vytvořené objekty jsou zde umístěny. Je to nejmladší a nejmenší generace. Sběrač odpadu (GC) kontroluje a čistí tuto generaci častěji. Objekty, které přežijí sběr v Gen 0, jsou přesunuty do Gen 1.
- Generace 1 (Gen 1): Obsahuje objekty, které přežily sběr v Gen 0. GC kontroluje tuto generaci méně často než Gen 0. Objekty, které přežijí sběr v Gen 1, jsou přesunuty do Gen 2.
- Generace 2 (Gen 2): Obsahuje dlouhodobé objekty z Gen 1, stejně jako velké objekty. GC kontroluje tuto generaci nejméně často. Sběr v Gen 2 je nejvíce časově náročný.
- Heap velkých objektů (LOH): Speciální oblast na haldě pro objekty o velikosti 85 KB nebo více. Objekty v LOH nejsou GC přesouvány, protože jejich přesun je velmi nákladný. Čištění LOH probíhá spolu se sběrem v Gen 2.
Rozdělení na generace je založeno na hypotéze, že nedávno vytvořené objekty se stávají odpadky rychleji než dlouhodobé. Tento přístup umožňuje GC efektivně čistit paměť, zaměřením na nejmladší generace.
// Příklad vytváření objektů v generaci 0
object obj1 = new object();
string str1 = "Hello";
// Po první sběr odpadu v Gen 0, pokud jsou obj1 a str1 stále potřeba,
// mohou být přesunuty do Gen 1.
// Dlouhodobý objekt
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Tento seznam může časem stoupnout do Gen 2.
// Velký objekt, který bude umístěn v LOH
byte[] largeArray = new byte[100 * 1024]; // Velikost > 85 KB