Tidak semua objek ditempatkan di area yang sama. Runtime .NET memisahkan objek berukuran 85.000 byte ke atas ke area tersendiri bernama Large Object Heap (LOH). Pemisahan ini mencegah objek raksasa menggeser objek kecil yang mengalokasi dengan cepat di generasi 0. Kita perlu mengenali LOH karena perilakunya berbeda: objek LOH langsung masuk generasi 2 dan jarang sekali dipindahkan.
Contoh: Menentukan Lokasi Objek Besar #
byte[] ukuranKecil = new byte[1_000];
byte[] ukuranBesar = new byte[90_000];
var ambang = GC.GetConfigurationVariables()["LOHThreshold"];
Console.WriteLine($"byte[1.000] masuk generasi {GC.GetGeneration(ukuranKecil)}");
Console.WriteLine($"byte[90.000] masuk generasi {GC.GetGeneration(ukuranBesar)}");
Console.WriteLine($"Ambang LOH menurut runtime: {ambang} byte");Output yang Dihasilkan:
byte[1.000] masuk generasi 0
byte[90.000] masuk generasi 2
Ambang LOH menurut runtime: 85000 byteMari kita bedah baris demi baris:
new byte[1_000]: array 1.000 byte berada jauh di bawah ambang, sehingga runtime menempatkannya di SOH (Small Object Heap) generasi 0.new byte[90_000]: array 90.000 byte melampaui ambang 85.000 byte. Runtime langsung menempatkannya di LOH, dan setiap objek LOH dihitung sebagai bagian generasi 2.GC.GetConfigurationVariables()["LOHThreshold"]: API ini membaca konfigurasi runtime langsung dari proses yang berjalan. Nilainya 85000 byte pada konfigurasi bawaan.- Dua panggilan
GC.GetGeneration: hasil0dan2membuktikan bahwa penempatan awal ditentukan oleh ukuran, bukan oleh usia objek.
Implikasi Performa LOH #
Objek LOH berada di generasi 2, dan generasi 2 hanya dikumpulkan saat GC penuh, yaitu kejadian yang paling jarang dan paling mahal. Buffer besar yang dibuang-buat berulang kali karenanya memicu GC penuh lebih sering. Strategi yang lazim: gunakan kembali buffer besar dengan ArrayPool<T> dari namespace System.Buffers, atau pecah data menjadi potongan di bawah ambang bila logika memungkinkan.
LOH bawaan juga tidak dimampatkan (compacted) pada setiap siklus, sehingga pengklaiman berulang bisa menyisakan lubang-lubang kecil yang disebut fragmentasi. Runtime modern menyediakan opsi pemampatan LOH, tetapi opsi ini menambah biaya dan perlu dipertimbangkan berdasarkan pengukuran.