Seluruh bab sebelumnya menyebut perilaku bawaan GC; bab ini menunjukkan tempat kita mengubahnya. Konfigurasi GC dibaca runtime saat proses dimulai, dan sumbernya dua lapis: properti MSBuild pada file .csproj yang ditranslasi ke runtimeconfig.json, atau runtimeconfig.template.json yang ditulis langsung. Karena keputusan GC sangat bergantung beban kerja, setiap perubahan konfigurasi wajib diikuti pengukuran.

Contoh Konfigurasi #

text
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
    <RetainVMGarbageCollection>false</RetainVMGarbageCollection>
  </PropertyGroup>

</Project>

Properti di atas mengalir ke runtimeconfig.json sebagai properti konfigurasi runtime:

text
{
  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true,
      "System.GC.Concurrent": true,
      "System.GC.RetainVM": false
    }
  }
}

Kedua bentuk menghasilkan proses yang sama; bentuk csproj lebih lazim karena terkelola bersama project. Selain tiga kunci di atas, runtime mengenali kunci lain yang tak punya padanan properti csproj, misalnya System.GC.HeapHardLimitPercent untuk membatasi ukuran heap dan System.GC.DynamicAdaptationMode untuk mode adaptif (DATAS) pada .NET 9. Kunci semacam itu ditulis langsung di runtimeconfig.template.json. Hindari menyalin konfigurasi tanpa kebutuhan; setiap kunci mengubah strategi GC dan efeknya wajib diukur ulang pada beban yang sama.

Pengukuran dengan GC.GetTotalMemory #

csharp
long sebelum = GC.GetTotalMemory(false);
var buffer = new byte[2_000_000];
long sesudah = GC.GetTotalMemory(false);

Console.WriteLine($"Alokasi 2.000.000 byte tercatat: {sesudah - sebelum} byte");
Console.WriteLine($"Panjang buffer: {buffer.Length} byte");

Output yang Dihasilkan:

text
Alokasi 2.000.000 byte tercatat: 2000024 byte
Panjang buffer: 2000000 byte

Mari kita bedah baris demi baris:

  1. GC.GetTotalMemory(false): API ini melaporkan perkiraan byte yang sedang dialokasikan di managed heap. Parameter false berarti jangan paksa koleksi dahulu.
  2. new byte[2_000_000]: alokasi 2 MB ini berada di LOH karena melampaui ambang 85.000 byte.
  3. Selisih 2.000.024 byte: 24 byte tambahan adalah overhead header objek, pola yang sama dengan bab Object Allocation. Selisih inilah bahan mentah untuk membandingkan perilaku sebelum dan sesudah mengubah konfigurasi.

Properti yang Sering Dipakai #

Properti csprojKunci runtimeconfigFungsi
ServerGarbageCollectionSystem.GC.Servermode server GC
ConcurrentGarbageCollectionSystem.GC.Concurrentbackground GC
RetainVMGarbageCollectionSystem.GC.RetainVMsimpan memori yang dibebaskan agar dipakai ulang