Kode contoh pada bab-bab sebelumnya bisa diukur dari dalam proses, tetapi aplikasi produksi menuntut alat yang mengamati dari luar. Ekosistem .NET menyediakan serangkaian CLI resmi: dotnet-counters untuk metrik langsung, dotnet-gcdump untuk potret isi heap, dan dotnet-trace untuk perekaman profil. Ketiganya menempel pada proses .NET yang sedang berjalan tanpa perlu membangun ulang kode.

dotnet-counters: Metrik GC Langsung #

Perintah dotnet-counters monitor --counters System.Runtime -p 12345 memantau proses dengan ID 12345. Metrik yang paling sering dibaca: alloc-rate (laju alokasi per detik), gen-0-gc-count, gen-1-gc-count, gen-2-gc-count (frekuensi koleksi per menit), gen-2-size, loh-size (ukuran Large Object Heap), dan time-in-gc (persentase waktu proses dihabiskan di GC).

text Contoh keluaran dotnet-counters (ilustrasi)
Press p to pause, r to resume, q to quit.
    Status: Running

Name                     Current Value
---                      -------------
System.Runtime
    CPU Usage (%)                    12.4
    GC Heap Size (MB)               186.2
    Gen 0 GC Count (Count / 1 min)      9
    Gen 1 GC Count (Count / 1 min)      2
    Gen 2 GC Count (Count / 1 min)      0
    LOH Size (MB)                  121.8
    Alloc Rate (MB / 1 sec)          42.7
    Time in GC (%)                   3.1

Pola yang perlu diwaspadai: alloc rate tinggi disertai gen0 count tinggi menandakan tekanan alokasi; LOH size yang terus tumbuh menandakan buffer besar dibuat berulang kali; time in GC di atas sepuluh persen menandakan GC terlalu sering menjadi penghambat.

dotnet-gcdump: Potret Isi Heap #

Perintah dotnet-gcdump collect -p 12345 menghasilkan file .gcdump. File itu dibuka di Visual Studio atau dotnet-gcdump report untuk melihat tipe apa yang menempati memori terbanyak dan berapa jumlah instansnya. Alur yang lazim: ambil dua dump dengan jeda beberapa menit, bandingkan jumlah instans, dan cari tipe yang jumlahnya terus naik tanpa penurunan.

Alur Diagnosis Tekanan Memori #

  1. Jalankan dotnet-counters dan catat alloc rate serta frekuensi koleksi saat beban normal.
  2. Bila gen2 atau LOH terus tumbuh, ambil dotnet-gcdump dua kali dan bandingkan tipe yang menumpuk.
  3. Turunkan ke kode: cari pemegang rujukan (event, field static, cache) dengan bantuan potret heap.
  4. Perbaiki dengan teknik bab Allocation Reduction, lalu ulangi langkah pertama untuk membuktikan perbaikannya.