Sobes.tech
Senior

Πώς γίνεται ο διαχωρισμός αντικειμένων στις σωρούς;

sobes.tech AI

Απάντηση από AI

Στο .NET, η στοίβα (heap) διαιρείται σε δύο βασικές γενιές: Γενιά 0 και Γενιά 1. Αν χρειαστεί, δημιουργείται η Γενιά 2.

  • Γενιά 0 (Gen 0): Τα νεοδημιουργημένα αντικείμενα τοποθετούνται εδώ. Είναι η πιο νεαρή και μικρότερη γενιά. Ο συλλέκτης απορριμμάτων (GC) ελέγχει και καθαρίζει αυτή τη γενιά πιο συχνά. Τα αντικείμενα που επιβιώνουν από τη συλλογή στη Gen 0 μετακινούνται στη Gen 1.
  • Γενιά 1 (Gen 1): Περιέχει αντικείμενα που έχουν επιβιώσει από τη συλλογή στη Gen 0. Ο GC ελέγχει αυτή τη γενιά λιγότερο συχνά από τη Gen 0. Τα αντικείμενα που επιβιώνουν από τη συλλογή στη Gen 1 μετακινούνται στη Gen 2.
  • Γενιά 2 (Gen 2): Περιέχει μακροχρόνια αντικείμενα από τη Gen 1, καθώς και μεγάλα αντικείμενα. Ο GC ελέγχει αυτή τη γενιά σπανιότερα. Η συλλογή στη Gen 2 είναι η πιο δαπανηρή σε χρόνο.
  • Heap Μεγάλων Αντικειμένων (LOH): Ειδική περιοχή στη στοίβα για αντικείμενα μεγέθους 85 KB ή περισσότερο. Τα αντικείμενα στο LOH δεν μετακινούνται από τον GC, καθώς η μετακίνησή τους είναι πολύ ακριβή. Ο καθαρισμός του LOH γίνεται μαζί με τη συλλογή στη Gen 2.

Ο διαχωρισμός σε γενιές βασίζεται στην υπόθεση ότι τα πρόσφατα δημιουργημένα αντικείμενα γίνονται πιο γρήγορα σκουπίδια από τα μακροχρόνια. Αυτή η προσέγγιση επιτρέπει στον GC να καθαρίζει αποτελεσματικά τη μνήμη, εστιάζοντας στις πιο νέες γενιές.

// Παράδειγμα δημιουργίας αντικειμένων στη Γενιά 0
object obj1 = new object();
string str1 = "Hello";

// Μετά την πρώτη συλλογή σκουπιδιών στη Gen 0, αν τα obj1 και str1 είναι ακόμα απαραίτητα,
// μπορούν να μετακινηθούν στη Γενιά 1.

// Μακροχρόνιο αντικείμενο
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Αυτή η λίστα μπορεί να ανέβει στη Γενιά 2 με τον χρόνο.

// Μεγάλο αντικείμενο, που θα τοποθετηθεί στο LOH
byte[] largeArray = new byte[100 * 1024]; // Μέγεθος > 85 KB