Bab Memory Pressure di section Memory Management mengukur tekanan dari dalam method; bab ini menyusun pengukuran itu menjadi alur kerja analisis yang berulang. Tujuannya menjawab tiga pertanyaan: berapa byte yang dialokasikan setiap unit pekerjaan, seberapa sering GC terpanggil akibatnya, dan pola kode mana yang menjadi kontributor terbesar. Metode ini menuntun kita sebelum masuk ke alat CLI seperti dotnet-gcdump.
Contoh: Profil Satu Batch Pekerjaan #
csharp
ProsesBatch(100); // pemanasan agar pengukuran murni mengukur eksekusi
int gcSebelum = GC.CollectionCount(0);
long byteSebelum = GC.GetAllocatedBytesForCurrentThread();
ProsesBatch(100);
Console.WriteLine($"Alokasi per batch : {GC.GetAllocatedBytesForCurrentThread() - byteSebelum} byte");
Console.WriteLine($"GC gen0 per batch : {GC.CollectionCount(0) - gcSebelum} kali");
void ProsesBatch(int jumlah)
{
for (int i = 0; i < jumlah; i++)
{
string baris = $"item-{i:0000}-data";
_ = baris.Length;
}
}Output yang Dihasilkan:
text
Alokasi per batch : 5600 byte
GC gen0 per batch : 0 kaliMari kita bedah baris demi baris:
ProsesBatch(100)pertama: panggilan pemanasan ini memastikan method telah dikompilasi JIT, sehingga pengukuran tidak tercemar biaya pertama.- Dua pembacaan dasar:
CollectionCount(0)danGetAllocatedBytesForCurrentThread()dicatat sebelum batch berjalan, lalu dibandingkan sesudahnya. ProsesBatch(100)kedua: batch membuat 100 string hasil interpolasi, masing-masing 56 byte, sehingga totalnya 5.600 byte.- Hitungan GC gen0
0 kali: batch kecil tidak cukup memenuhi budget generasi 0, sehingga tidak ada koleksi. Bila hasil analisis menunjukkan angka ini membesar, artinya tekanan alokasi mulai memaksa GC bekerja di tengah pekerjaan. Bandingkan angka hanya antar pengukuran pada mesin dan beban yang sama, karena ukuran heap bawaan memengaruhi hasilnya.
Alur Analisis Lengkap #
- Ukur alokasi dan hitungan GC per unit pekerjaan dengan contoh di atas.
- Temukan kontributor terbesar: string di loop, LINQ yang dieksekusi berulang, atau boxing.
- Perbaiki dengan teknik bab Allocation Reduction, satu perubahan pada satu waktu.
- Jalankan pengukuran ulang dan bandingkan angkanya, bukan perasaan.
- Untuk beban produksi, lanjutkan ke alur dotnet-counters dan dotnet-gcdump pada bab GC Diagnostics.