Saat program berjalan, data harus disimpan di memori. Ukuran ruang yang dipakai data serta lokasi penyimpanannya ditentukan oleh tipe data. Terdapat dua bagian memori yang dipakai untuk menampung data saat eksekusi program: Tumpukan (Stack) dan Gundukan (Heap).
Tumpukan (Stack)
Tumpukan adalah larik memori yang berurutan, mengikuti struktur data Masuk Terakhir Keluar Pertama (LIFO), dan menyimpan tiga jenis data berikut:
- Nilai variabel dari beberapa tipe data
- Konteks eksekusi program saat ini
- Parameter yang dikirim ke dalam metode

Operasi memori pada tumpukan dikelola otomatis oleh sistem, pengembang tidak perlu mengaturnya secara manual. Memahami logika dasar tumpukan akan memudahkan Anda memahami alur eksekusi program dan dokumentasi resmi C#.
Karakteristik Utama Tumpukan
- Hanya bisa menambah dan menghapus data di bagian paling atas tumpukan
- Menyimpan data ke puncak tumpukan: Push
- Mengambil data dari puncak tumpukan: Pop
Ciri Memori Tumpukan
- Proses alokasi dan pelepasan memori sangat cepat, menggunakan ruang memori yang berurutan
- Siklus hidup terikat pada pemanggilan metode: bingkai tumpukan akan terhapus otomatis setelah metode selesai dijalankan
- Yang disimpan: variabel tipe nilai, parameter metode, variabel lokal, konteks eksekusi

Agar lebih mudah memahami cara kerja gundukan, mari kita lihat contoh kode sederhana
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 20;
int sum = Add(a, b);
}
static int Add(int x, int y)
{
return x + y;
}
}
Code language: JavaScript (javascript)
Logika contoh ini sangat sederhana. Dimulai dari baris pertama fungsi Main sebagai titik masuk program, kita buat variabel bertipe int bernama a, lalu baris kedua membuat variabel b. Baris ketiga memanggil fungsi Add dengan mengirimkan nilai a dan b ke dalam fungsi. Di dalam fungsi, x menerima nilai a dan y menerima nilai b, lalu fungsi mengembalikan hasil penjumlahan x + y yaitu 30 ke tempat pemanggilan untuk dimasukkan ke variabel sum. Setelah fungsi Add selesai berjalan, x dan y akan dikeluarkan dari tumpukan, nilai sum menjadi 30, lalu setelah Main selesai program akan keluar. Berikut kita bahas langkah demi langkah bagaimana seluruh proses ini berlangsung di dalam tumpukan.
Alur eksekusi program dan proses Push serta Pop pada tumpukan





Setelah Add selesai dijalankan, x dan y adalah parameter lokal milik Add sehingga akan diproses Pop satu per satu untuk mengosongkan ruang tumpukan agar sistem berjalan lancar.
Setelah Pop x dan y hilang, nilai 30 hasil kembalian Add dikirim ke tempat pemanggilan untuk dimasukkan ke sum.




Ingat satu hal: saat fungsi berjalan variabel dibuat dari atas ke bawah dan dipush ke tumpukan dengan urutan a → b → masuk ke Add → x → y. Setelah Add selesai x dan y dipop, lalu sum dipush. Ketika Main berakhir variabel dihapus berbalik urutan pembuatan: sum, b, a.
Gundukan (Heap)
Gundukan adalah wilayah memori luas yang digunakan untuk mengalokasikan blok memori guna menampung objek data. Berbeda dengan tumpukan, data di gundukan bisa ditambah dan dihapus dengan urutan acak.
Program tidak bisa menghapus objek di gundukan secara manual, pembersihan objek yang tidak ada referensi dan tidak bisa diakses dilakukan otomatis oleh GC (Garbage Collector) milik CLR (Common Language Runtime). Hal ini menghindari kesalahan akibat pelepasan memori manual yang wajib dilakukan di bahasa pemrograman lain.
Gundukan bisa diibaratkan meja lebar yang bisa diisi barang sembarangan. Sedangkan tumpukan yang kita bahas sebelumnya mirip tabung koin yang hanya bisa masuk dan keluar dari satu ujung.

Alur Pembersihan GC
- Program membuat tiga objek di gundukan dan menyimpan referensi ke objek tersebut
- Program berhenti menggunakan salah satu objek sehingga semua referensi terputus
- GC mendeteksi objek tanpa referensi dan membebaskan memori yang dipakainya
- Pembersihan selesai, memori yang sudah dibebaskan bisa dialokasikan untuk objek baru
Ciri Memori Gundukan
- Memori tidak berurutan, kecepatan alokasi lebih lambat dibanding tumpukan
- Siklus hidup tidak terikat batas fungsi, dikelola secara terpusat oleh GC
- Yang disimpan: instans tipe referensi (kelas, larik, delegat dll.), tumpukan hanya menyimpan alamat memori objek di gundukan
Mari kita lihat contoh agar lebih jelas. Seperti yang dijelaskan sebelumnya variabel lokal tipe dasar disimpan di tumpukan, sedangkan tipe buatan pengguna umumnya disimpan di gundukan. Berikut contoh kodenya:
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 20;
Student tom = new Student("Tom", 12);
Student lucy = new Student("Lucy", 12);
}
}
class Student
{
//Variabel anggota
private string name;
private int age;
//Konstruktor, akan dibahas di bab selanjutnya
public Student(string name, int age)
{
this.name = name;
this.age = age;
}
//Metode anggota
public void DisplayInfo()
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
}
Code language: JavaScript (javascript)
Gambar berikut menunjukkan skema penyimpanan empat variabel a, b, tom, lucy di dalam fungsi Main. Sama seperti penjelasan tumpukan sebelumnya, kode dijalankan dari atas ke bawah, variabel a dipush duluan lalu b. Nilai a dan b disimpan langsung di tumpukan.


Contoh data tom tersimpan di blok gundukan 00001, tumpukan menyimpan alamat 00001 agar kita bisa menemukan data tersebut nantinya.
Setelah fungsi Main selesai dijalankan, referensi alamat lucy: 01010 di tumpukan akan dipop dan dihapus. Yang hilang hanya alamatnya saja, data objek asli di gundukan tetap ada. Saat ini objek di gundukan tidak lagi memiliki variabel di tumpukan yang mencatat alamatnya.


Wilayah Memori
Tumpukan dan gundukan adalah pembagian memori di tingkat perangkat lunak, bukan pembagian fisik perangkat keras.
Tumpukan dan gundukan hanyalah pembagian logis memori yang dibuat software, perangkat keras RAM fisik tidak memiliki modul khusus yang bertanda “wilayah tumpukan” atau “wilayah gundukan”.
RAM fisik hanya berupa chip memori seragam dengan alamat fisik berurutan, tidak ada penanda khusus yang memisahkan tumpukan dan gundukan
Sistem operasi memberikan ruang memori virtual terpisah untuk setiap program yang berjalan, lalu membagi memori virtual ini menjadi empat segmen logis utama:
Segmen Kode: Menyimpan instruksi program hasil kompilasi
Segmen Statis Global: Variabel statis, konstanta
Segmen Tumpukan (Stack): Utas utama dan utas turunan program masing-masing memiliki blok tumpukan mandiri
Segmen Gundukan (Heap): Kumpulan memori bersama luas untuk alokasi dinamis
Tumpukan dan gundukan yang dibahas di sini hanyalah wilayah logis yang diberikan OS untuk setiap proses, tidak ada isolasi di tingkat perangkat keras.
Tumpukan vs Gundukan