Koleksi generasi 2 adalah pekerjaan paling mahal bagi GC, dan versi lama .NET menjalankannya dengan menghentikan seluruh thread aplikasi. Background GC menyelesaikan masalah itu: satu thread GC khusus melakukan penandaan generasi 2 secara paralel dengan thread aplikasi, sehingga jeda panjang menjadi jauh lebih pendek. Fitur ini aktif secara bawaan pada aplikasi .NET modern, dan kita dapat memverifikasinya dari konfigurasi runtime.
Contoh: Memeriksa Background GC Aktif #
var konfigurasi = GC.GetConfigurationVariables();
Console.WriteLine($"ConcurrentGC (background): {konfigurasi["ConcurrentGC"]}");
Console.WriteLine($"ServerGC : {konfigurasi["ServerGC"]}");
Console.WriteLine($"Latency mode : {GCSettings.LatencyMode}");Output yang Dihasilkan:
ConcurrentGC (background): True
ServerGC : False
Latency mode : InteractiveMari kita bedah baris demi baris:
konfigurasi["ConcurrentGC"]: nilaiTrueberarti background GC aktif untuk mode workstation. Nama kuncinya mengacu pada propertiSystem.GC.Concurrentdi runtimeconfig.konfigurasi["ServerGC"]: hasilFalsemenempatkan kita di workstation GC; background GC pun punya versi servernya sendiri (System.GC.ServerplusSystem.GC.Concurrent).GCSettings.LatencyMode:Interactiveadalah pasangan wajib background GC pada mode workstation, karena mode inilah yang memanfaatkan koleksi paralel.
Cara Kerja Singkat #
Saat GC penuh dibutuhkan dan background GC aktif, thread GC khusus menjalankan penandaan generasi 2 di latar belakang, sementara thread aplikasi terus berjalan untuk sebagian besar waktu penandaan. Dua hal tetap menghentikan thread aplikasi sesaat: fase persiapan dan fase penyelesaian penandaan, serta koleksi generasi 0 dan 1 yang tetap berjalan blocking di tengah proses. Karena itu background GC memangkas jeda panjang, tetapi tidak menghapus seluruh jeda.
Perilaku runtime yang bergantung waktu seperti di atas tidak bisa ditunjukkan lewat output program; pengamatannya memakai alat seperti dotnet-counters yang dibahas pada bab GC Diagnostics. Yang penting diingat: mode ini aktif secara bawaan, jadi pekerjaan kita biasanya memastikan konfigurasi tidak sengaja menonaktifkannya.