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 #

csharp
var konfigurasi = GC.GetConfigurationVariables();
Console.WriteLine($"ConcurrentGC (background): {konfigurasi["ConcurrentGC"]}");
Console.WriteLine($"ServerGC                 : {konfigurasi["ServerGC"]}");
Console.WriteLine($"Latency mode             : {GCSettings.LatencyMode}");

Output yang Dihasilkan:

text
ConcurrentGC (background): True
ServerGC                 : False
Latency mode             : Interactive

Mari kita bedah baris demi baris:

  1. konfigurasi["ConcurrentGC"]: nilai True berarti background GC aktif untuk mode workstation. Nama kuncinya mengacu pada properti System.GC.Concurrent di runtimeconfig.
  2. konfigurasi["ServerGC"]: hasil False menempatkan kita di workstation GC; background GC pun punya versi servernya sendiri (System.GC.Server plus System.GC.Concurrent).
  3. GCSettings.LatencyMode: Interactive adalah 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.