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 #
| Generasi | Isi | Frekuensi koleksi | Biaya per koleksi |
|---|---|---|---|
| 0 | objek baru | sangat sering | sangat kecil |
| 1 | selamat satu siklus | jarang | kecil |
| 2 | objek berumur panjang + LOH | paling jarang | paling mahal |
Contoh: Promosi dan Hitungan Koleksi #
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:
Awal: generasi 0
Setelah 3 kali GC: generasi 2
Gen0 terkumpul : 3 kali
Gen2 terkumpul : 3 kaliMari kita bedah baris demi baris:
new byte[500]: array mulai di generasi 0. Variabelsurvivormenahan rujukan, sehingga array akan selamat dari setiap siklus.- Loop tiga kali
GC.Collect(): setiap siklus memeriksa seluruh generasi dan mempromosikan array satu tingkat, dari 0 ke 1 lalu ke 2. GC.GetGenerationakhir: hasil2menunjukkan array kini tergolong objek berumur panjang yang paling jarang diperiksa.- 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.