Setiap object yang kita buat menempati sebagian memori program. Object tidak bertahan selamanya: program membuatnya, memakainya selama masih dirujuk, dan pada akhirnya runtime mengambil kembali memorinya. Alur tersebut disebut object lifecycle, dan memahaminya membantu kita menjaga konsumsi memori tetap sehat.
Tahap Pembuatan #
Kata kunci new menjalankan dua langkah. Runtime mengalokasikan ruang di heap, lalu constructor mengisi data awal object. Nilai yang dikembalikan new adalah reference, yaitu alamat object yang disimpan di dalam variable.
Tahap Masa Aktif #
Object tetap hidup selama terdapat minimal satu reference yang menunjuknya. Reference hilang ketika variable keluar dari scope, diisi null, atau dialihkan ke object lain. C# tidak menyediakan operator penghapusan manual seperti delete di C++; pengelolaan memori sepenuhnya diserahkan ke runtime.
Tahap Pembersihan oleh Garbage Collector #
Object tanpa reference disebut garbage. Garbage collector (GC) secara berkala memeriksa heap, mengidentifikasi object yang tak dirujuk lagi, dan membebaskan memorinya. Waktu eksekusi GC ditentukan oleh runtime, bukan oleh programmer, sehingga kita tidak dapat menjadwalkannya secara presisi.
Contoh: Mengamati GC Bekerja #
public class KeranjangBelanja
{
public string Pemilik { get; set; }
public KeranjangBelanja(string pemilik)
{
Pemilik = pemilik;
Console.WriteLine($"Keranjang untuk {Pemilik} dibuat.");
}
}
KeranjangBelanja keranjangAktif = new KeranjangBelanja("Budi");
for (int i = 1; i <= 3; i++)
{
KeranjangBelanja keranjangSementara = new KeranjangBelanja($"Sementara {i}");
}
Console.WriteLine($"Sebelum GC: generasi 0 dikumpulkan {GC.CollectionCount(0)} kali.");
GC.Collect();
Console.WriteLine($"Sesudah GC: generasi 0 dikumpulkan {GC.CollectionCount(0)} kali.");
Console.WriteLine($"Object aktif masih terpakai: {keranjangAktif.Pemilik}");Output yang Dihasilkan:
Keranjang untuk Budi dibuat.
Keranjang untuk Sementara 1 dibuat.
Keranjang untuk Sementara 2 dibuat.
Keranjang untuk Sementara 3 dibuat.
Sebelum GC: generasi 0 dikumpulkan 0 kali.
Sesudah GC: generasi 0 dikumpulkan 1 kali.
Object aktif masih terpakai: BudiMari kita bedah baris demi baris:
new KeranjangBelanja("Budi"): Object pertama dibuat, dan reference-nya disimpan dikeranjangAktifsehingga object ini tetap dirujuk sepanjang contoh.- Loop
for: Tiga object sementara dibuat; setiapkeranjangSementarakeluar dari scope pada akhir putaran, sehingga ketiganya menjadi garbage. GC.CollectionCount(0): Method ini menghitung berapa kali generasi termuda (generasi 0) telah dikumpulkan; sebelum pemanggilan manual, angkanya masih0.GC.Collect(): Pemanggilan ini memaksa pembersihan; setelahnya penghitung naik menjadi1, bukti bahwa object sementara telah dihapus dari heap.keranjangAktif.Pemilik: Object yang masih dirujuk selamat dari pembersihan; GC hanya mengambil object tanpa reference.
Dengan memahami lifecycle, kita tahu bahwa memori object diurus runtime, sedangkan tanggung jawab kita adalah tidak menahan reference yang tidak diperlukan.