Section ini berjalan dari stack dan heap hingga pengurangan alokasi; bab ini merangkumnya menjadi kebiasaan kerja harian. Prinsip utamanya sederhana: garbage collector menangani memori managed dengan baik selama kita tidak menahan rujukan yang tak diperlukan dan tidak mengalokasikan secara berlebihan. Sisa tugas kita ada pada resource di luar jangkauan GC, dan bab ini menjadi peta rujukan untuk kedua section terakhir ini.

Daftar Periksa Harian #

  • Ukur sebelum mengoptimalkan: GC.GetAllocatedBytesForCurrentThread() untuk alokasi, GC.CollectionCount untuk frekuensi GC.
  • Utamakan struct kecil untuk data nilai, class untuk objek yang dibagikan.
  • Panggil Dispose atau bungkus resource dengan using, seperti pada contoh di bawah.
  • Lepaskan langganan event yang tidak lagi diperlukan agar objek penerbit tidak terus memegang objek pelanggan.
  • Hindari finalizer; gunakan hanya bila membungkus resource native tanpa pustaka pembungkus yang aman.
  • Perhatikan field static dan closure; keduanya mudah memperpanjang usia objek besar tanpa disadari.
  • Sewa buffer besar dari ArrayPool<T> alih-alih mengalokasikannya berulang kali di LOH.

Contoh: Kontrak Pembebasan dengan using #

csharp
using SumberDaya sumber = new SumberDaya();
Console.WriteLine("Sumber daya sedang dipakai");

class SumberDaya : IDisposable
{
    public void Dispose() => Console.WriteLine("Dispose dipanggil otomatis oleh using");
}

Output yang Dihasilkan:

text
Sumber daya sedang dipakai
Dispose dipanggil otomatis oleh using

Mari kita bedah baris demi baris:

  1. using SumberDaya sumber = ...: deklarasi using menjamin compiler menyisipkan pemanggilan Dispose tepat saat variabel keluar dari cakupan, termasuk saat exception terjadi.
  2. Console.WriteLine pertama: pemakaian resource tetap tertulis secara normal di dalam cakupan.
  3. Dispose(): method ini dipanggil runtime, bukan oleh GC. Urutan cetak pada output membuktikan pembebasan resource berjalan deterministik, berbeda dari finalizer.

Lanjutkan perjalanan ke section Garbage Collection untuk membedah mekanisme GC dari dalam: generasi, mode kerja, konfigurasi, hingga alat diagnosisnya.