Java Stack vs. Heap: Panduan Praktis Alokasi Memori
Apa Itu Memori Stack?
Di Java, stack adalah wilayah memori berseberang yang menampung frame pemanggilan metode, variabel lokal, dan variabel referensi. Setiap kali metode dipanggil, frame baru ditumpuk ke stack. Memori stack diorganisir dengan pola Last-In, First-Out (LIFO), artinya panggilan terbaru adalah yang pertama dihapus saat metode kembali.
Apa Itu Memori Heap?
Heap adalah area tempat objek Java dibuat. Ini menampung semua instance kelas dan, secara opsional, variabel referensi yang menunjuk ke objek-objek tersebut. Berbeda dengan stack, heap tidak terikat pada siklus hidup satu pemanggilan metode, memungkinkan objek bertahan di luar cakupan tempat mereka dibuat.
Alokasi Memori di Java
Alokasi memori di Java merujuk pada proses menyediakan memori virtual untuk data program. Variabel tidak dialokasikan saat deklarasi; sebagai gantinya, referensi dibuat. Saat operator new digunakan, JVM mengalokasikan ruang pada heap untuk objek.
Java membagi memori menjadi empat bagian yang berbeda untuk pengelolaan yang efisien:
- Heap
- Stack
- Code (Bytecode)
- Static (Data Kelas)
- Bagian Code berisi bytecode yang dikompilasi.
- Stack menampung frame metode, variabel lokal, dan variabel referensi.
- Heap menyimpan objek dan, sesekali, variabel referensi.
- Bagian Static menyimpan bidang dan metode statis.
Variabel Lokal vs. Variabel Instance
Variabel instance dideklarasikan dalam kelas tetapi di luar metode apa pun:
class Student { int num; // variabel instance public void showData() {} }
Variabel lokal dideklarasikan di dalam metode (atau sebagai parameter metode):
public void sum(int a) { int x = a + 3; // a dan x adalah variabel lokal }
Stack vs. Heap dalam Aksi
Mari kita melalui contoh untuk mengilustrasikan bagaimana stack dan heap berinteraksi selama pemanggilan metode.
Asumsikan metode main memanggil m1():
public void m1() { int x = 20; }
Frame untuk m1 ditumpuk ke stack. Variabel lokal x disimpan dalam frame ini.
Saat m1 memanggil m2(int b), frame baru ditambahkan di atas frame m1:
public void m2(int b) { boolean c; }
Demikian pula, m2 memanggil m3(), menciptakan frame lain:
Di dalam m3, objek Account diinstantiasi pada heap, sementara referensinya ref tinggal pada stack:
class Account { int p; int q; } public void m3() { Account ref = new Account(); // kode tambahan }
Variabel referensi ref dibuat dalam frame stack m3 dan menunjuk ke objek Account yang dialokasikan heap.
Saat m3 selesai, frame stack-nya dihapus, meninggalkan objek Account tanpa referensi apa pun. Objek menjadi layak untuk garbage collection.
Proses yang sama berulang untuk m2 dan m1, mengembalikan kontrol ke main.
Referensi Objek sebagai Variabel Instance
Pertimbangkan kelas A yang menyimpan referensi ke instance dari B:
public static void main(String[] args) { A parent = new A(); // kode tambahan } class A { B child = new B(); int e; } class B { int c; int d; }
Di sini, referensi child disimpan pada heap sebagai bagian dari objek A, menunjuk ke instance B itu sendiri.
Poin Utama
- Setiap pemanggilan metode menciptakan frame baru pada stack.
- Variabel lokal tinggal pada stack; variabel instance ada pada heap.
- Variabel referensi disimpan pada stack tetapi menunjuk ke objek heap.
- Saat frame stack dihapus, variabel lokal dan referensinya dibuang, dan objek heap yang menjadi yatim piatu menjadi layak untuk garbage collection.