Sobes.tech
Senior

Jak przebiega podział obiektów na stertach?

sobes.tech AI

Odpowiedź od AI

W .NET, stos (heap) dzieli się na dwie główne generacje: Pokolenie 0 i Pokolenie 1. W razie potrzeby tworzona jest Pokolenie 2.

  • Pokolenie 0 (Gen 0): Nowo utworzone obiekty są tutaj umieszczane. To najmlodsze i najmniejsze pokolenie. Zbieracz śmieci (GC) najczęściej sprawdza i czyści to pokolenie. Obiekty, które przetrwają zbieranie w Gen 0, są przenoszone do Gen 1.
  • Pokolenie 1 (Gen 1): Zawiera obiekty, które przetrwały zbieranie w Gen 0. GC sprawdza to pokolenie rzadziej niż Gen 0. Obiekty, które przetrwają zbieranie w Gen 1, są przenoszone do Gen 2.
  • Pokolenie 2 (Gen 2): Zawiera długotrwałe obiekty z Gen 1, a także duże obiekty. GC sprawdza to pokolenie najrzadziej. Zbiórka w Gen 2 jest najbardziej czasochłonna.
  • Heap dużych obiektów (LOH): Specjalny obszar na stosie dla obiektów o rozmiarze 85 KB lub więcej. Obiekty w LOH nie są przenoszone przez GC, ponieważ ich przenoszenie jest bardzo kosztowne. Czyszczenie LOH odbywa się razem z zbieraniem Gen 2.

Podział na generacje opiera się na hipotezie, że niedawno utworzone obiekty najczęściej stają się śmieciami szybciej niż obiekty długotrwałe. Takie podejście pozwala GC efektywnie czyścić pamięć, koncentrując się na najmlodszych pokoleniach.

// Przykład tworzenia obiektów w Pokoleniu 0
object obj1 = new object();
string str1 = "Hello";

// Po pierwszym zbieraniu śmieci w Gen 0, jeśli obj1 i str1 są jeszcze potrzebne,
// mogą zostać przeniesione do Gen 1.

// Obiekt długotrwały
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Ta lista może z czasem awansować do Gen 2.

// Duży obiekt, który zostanie umieszczony w LOH
byte[] largeArray = new byte[100 * 1024]; // Rozmiar > 85 KB