Konsep generasi telah diperkenalkan pada bab Generations dan GC di section Memory Management; bab ini melanjutkannya dari sisi mekanisme dan frekuensi. GC .NET memberi setiap generasi budget, yaitu jatah memori yang boleh terisi sebelum GC berjalan. Budget generasi 0 kecil (bernilai ratusan KB hingga beberapa MB) sehingga cepat penuh dan cepat dikumpulkan; budget generasi 2 besar dan hanya disentuh saat GC penuh. Strategi ini efektif karena mayoritas objek berumur sangat pendek.

Frekuensi per Generasi #

GenerasiIsiFrekuensi koleksiBiaya per koleksi
0objek barusangat seringsangat kecil
1selamat satu siklusjarangkecil
2objek berumur panjang + LOHpaling jarangpaling mahal

Contoh: Promosi dan Hitungan Koleksi #

csharp
var survivor = new byte[500];
Console.WriteLine($"Awal: generasi {GC.GetGeneration(survivor)}");

int gen0Sebelum = GC.CollectionCount(0);
int gen2Sebelum = GC.CollectionCount(2);

for (int i = 0; i < 3; i++)
    GC.Collect();

Console.WriteLine($"Setelah 3 kali GC: generasi {GC.GetGeneration(survivor)}");
Console.WriteLine($"Gen0 terkumpul   : {GC.CollectionCount(0) - gen0Sebelum} kali");
Console.WriteLine($"Gen2 terkumpul   : {GC.CollectionCount(2) - gen2Sebelum} kali");

Output yang Dihasilkan:

text
Awal: generasi 0
Setelah 3 kali GC: generasi 2
Gen0 terkumpul   : 3 kali
Gen2 terkumpul   : 3 kali

Mari kita bedah baris demi baris:

  1. new byte[500]: array mulai di generasi 0. Variabel survivor menahan rujukan, sehingga array akan selamat dari setiap siklus.
  2. Loop tiga kali GC.Collect(): setiap siklus memeriksa seluruh generasi dan mempromosikan array satu tingkat, dari 0 ke 1 lalu ke 2.
  3. GC.GetGeneration akhir: hasil 2 menunjukkan array kini tergolong objek berumur panjang yang paling jarang diperiksa.
  4. Dua hitungan selisih: keduanya bertambah tiga karena GC.Collect() tanpa parameter selalu menjalankan koleksi penuh. Pada kondisi normal tanpa pemanggilan eksplisit, hitungan gen2 tumbuh jauh lebih lambat daripada gen0.

Ukuran budget diatur runtime dan berubah mengikuti beban, bukan ditentukan lewat kode aplikasi. Yang bisa kita kendalikan adalah bentuk beban: objek sementara sebaiknya benar-benar sementara, dan objek yang dipertahankan sebaiknya memang layak mencapai generasi 2.