Beberapa aplikasi sangat peka jeda (latency-sensitive), misalnya sistem trading atau perenderan real-time. Untuk mereka, .NET menyediakan GCLatencyMode, yaitu kendali kasar atas seberapa agresif GC boleh berjalan. Mode ini diubah saat proses berjalan lewat GCSettings.LatencyMode, sehingga kita bisa mengetatkan latensi hanya pada bagian aplikasi yang membutuhkan.

Daftar Mode #

ModePerilakuCocok untuk
Interactivekoleksi generatif dengan background GCaplikasi umum, bawaan
Batchkoleksi lebih jarang, jeda lebih besar namun lebih sedikitbatch job tanpa interaksi
SustainedLowLatencymenahan koleksi gen2 blockingfase penting yang panjang
NoGCRegionmenghentikan GC selama blok tertentubagian paling kritis, durasi pendek

Contoh: Mengubah Mode Saat Berjalan #

csharp
Console.WriteLine($"Mode awal : {GCSettings.LatencyMode}");

GCSettings.LatencyMode = GCLatencyMode.SustainedLowLatency;

Console.WriteLine($"Mode baru : {GCSettings.LatencyMode}");

Output yang Dihasilkan:

text
Mode awal : Interactive
Mode baru : SustainedLowLatency

Mari kita bedah baris demi baris:

  1. GCSettings.LatencyMode pertama: hasil Interactive adalah mode bawaan workstation GC dengan background GC aktif.
  2. Penugasan GCLatencyMode.SustainedLowLatency: kita meminta GC menahan koleksi generasi 2 blocking dan koleksi LOH selama fase ini berlangsung.
  3. GCSettings.LatencyMode kedua: hasil SustainedLowLatency membuktikan mode berlaku seketika tanpa perlu memulai ulang proses.

Batas dan Risiko Tiap Mode #

SustainedLowLatency tidak menahan koleksi generasi 0 dan 1; koleksi muda tetap berjalan karena diperlukan agar heap tidak meluap. Mode ini menunda pekerjaan berat, bukan menghapusnya, sehingga memori tetap harus dijaga. Mode NoGCRegion diaktifkan lewat GC.TryStartNoGCRegion(totalSize): GC berjanji tidak mengklaim apa pun selama alokasi masih muat dalam totalSize, dan mode berakhir lewat GC.EndNoGCRegion(). Bila anggaran terlampaui, runtime memanggil GC penuh meskipun kita belum selesai, dan panggilan EndNoGCRegion gagal dengan exception.