Membuat JVM Stack Area Java dan Fungsinya
Pada dasarnya JVM adalah sebuah stack dan register mesin pada bahasa pemrograman Java. Setiap frame untuk pemanggilan method memiliki "operand stack" dan array dari variabel lokal (Lindholm, dkk. 2015). JVM menciptakan stack terpisah pada saat thread yang diciptakan. Penggunaan memori untuk JVM stack tidak dibutuhkan secara berkelanjutan. JVM hanya aktif pada dua operasi secara langsung pada Java Stack, yaitu pada saat push dan pops frame. Stack pada thread tertentu akan dianggap sebagai Runtime Stack.
Setiap method memanggil operasinya menggunakan thread tersebut yang disediakan sesuai dengan runtime stack-nya termasuk parameter, variabel lokal, komputasi terdekat, dan data lainnya. Setelah method selesai dijalankan, entry yang cocok akan dihapus. Setelah menyelesaikan semua panggilan, method stack akan dikosongkan dan stack yang kosong akan dihancurkan oleh JVM sebelum thread dimatikan. Data yang disediakan pada stack juga tersedia untuk thread yang cocok dan tidak tersedia untuk thread sisa. Oleh karena itu, kita bisa menyebut data lokal sebagai thread safe. Setiap masukkan pada stack disebut dengan stack frame atau activation record (aktivasi penyimpanan) seperti ditunjukkan pada gambar 1.
Keterangan Gambar 1
- LVA: Local Variable Array
- OS: Operand Stack
- FD: Frame Data
Struktur Bingkai Stack
Bingkai stack pada dasarnya terdiri dari tiga bagian yaitu: variabel array lokal, stack operand, dan data frame atau bingkai data. Ketika JVM memanggil method Java, yang dilakukan JVM adalah memeriksa data class untuk menentukan jumlah huruf yang dibutuhkan oleh method pada variabel array lokal dan operand stack. JVM menciptakan stack frame dari ukuran yang sesuai untuk memanggil method dan mendorongnya menuju Java stack.
Bingkai stack pada dasarnya terdiri dari tiga bagian yaitu: variabel array lokal, stack operand, dan data frame atau bingkai data. Ketika JVM memanggil method Java, yang dilakukan JVM adalah memeriksa data class untuk menentukan jumlah huruf yang dibutuhkan oleh method pada variabel array lokal dan operand stack. JVM menciptakan stack frame dari ukuran yang sesuai untuk memanggil method dan mendorongnya menuju Java stack.
Variabel array local (LVA atau local variables array):
/* Pendeklarasian class */
class Example
{
public void bike(int i, long l, float f, double d, Object o, byte b)
{return 0;}
}
Operand Stack (OS):
- Variabel lokal adalah bagian dari stack frame yang diatur sebagai array berbasis nol dari kata yang digunakan.
- LVA mengandung semua parameter dan variabel lokal dari method.
- Setiap slot pada entry array terdiri dari 4 bytes.
- Nilai dari tipe data integer, dan yang setara menempati 1 entry atau slot dalam array 4 bytes.
- Nilai dari tipe data double dan long menempati 2 entry secara berurutan pada array 8 bytes.
- Tipe data byte, short, dan char akan dikonversi ke dalam tipe data integer dan menempati 1 slot ukuran 4 bytes.
- Tetapi penempatan nilai Boolean adalah bervariasi dari satu JVM ke JVM lain. Tetapi, kebanyakan JVM memberikan 1 slot untuk tipe data Boolean pada variabel array lokal.
- Parameter akan ditempatkan pada variabel array lokal dalam pesanan sesuai dengan permintaan yang dideklarasikan.
- Contohnya; misal class Example memiliki method bike(), selanjutnya diperlihatkan pada gambar 2 sebagai berikut:
/* Pendeklarasian class */
class Example
{
public void bike(int i, long l, float f, double d, Object o, byte b)
{return 0;}
}
- JVM menggunakan operand stack sebagai ruang kerja seperti rough work atau tempat penyimpanan hasil kalkulasi sementara.
- Operand stack diatur sebagai array huruf seperti variabel array lokal, namun tidak seperti pengaksesan menggunakan indek, seperti variabel array lokal, melainkan pengaksesannya menggunakan beberapa instruksi sehingga bisa mendorong nilai menuju operand stack dan beberapa instruksi yang bisa mengeluarkan nilai dari operand stack, serta beberapa instruksi lain yang bisa menunjukkan kebutuhan operasi.
- Contohnya; diperlihatkan beberapa JVM menggunakan kode berikut yang dapat disubstrak ke dalam dua variabel lokal yang mengandung dua integer dan menyimpannya pada variabel lokal ketiga.
iload_0 // mendorong int dalam pengoperasian stack
iload_1 // mendorong int dalam pengoperasian stack
isub // menampilkan dan melakukan substraksi dua int dan mendorongnya mengeluarkan hasil dalam pengoperasian stack
istore_2 // mengeluarkan hasil dan menyimpannya ke dalam variabel lokal pada index 2
- Dua instruksi berikut ini lload_0 dan lload_1 akan mendorong nilai dalam operand stack dari variabel lokal untuk pergi, dan instruksi isub akan mensubtraksi kedua nilai tersebut dan menyimpannya kembali menuju operand stack. Setelah hasil dari istore_2 muncul dari operand stack maka akan tersedia pada variabel array lokal pada posisi 2 seperti diperlihatkan pada gambar 3.
Frame Data (FD):
- FD mengandung semua refensi simbol dan pengembalian normal method dengan metode tertentu.
- FD juga mengandung referensi untuk Exception table yang menyediakan korenpondensi tangkapan informasi blok pada kondisi tertentu.
Artikel ini didedikasikan kepada: Rizka Meiladinitta, Salsabila Qurratu 'Ain Nailah Afuwwu, Sindy Nilasari Putri Wardani, Ulfa Laela Rahmadon, dan Vicky Septyawan.
Ada yang bisa bantu jelasin dengan lebih sederhana haha
BalasHapusUntuk dapat memahami stack pada Java, terlebih dahulu mari kita pahami apa yang dimaksud dengan stack itu sendiri.
HapusStack adalah struktur data linier yang mengikuti aturan tertentu dimana operasi dilakukan. Urutan struktur nya adalah FILO atau First in last Out atau juga LIFO (last in first out).
Sederhananya, untuk membuat rancangan stack umumnya digunakan array (jika input bernilai tetap), lainnya adalah linked list, setelah itu barulah dapat dilakukan operasi stack.
Jenis operasi stack terdiri dari
1. Push : Digunakan untuk memasukkan elemen atau inputan ke dalam stack.
2. Pop : digunakan untuk mengambil elemen atau inputan dari dalam stack.
3. Peek : Untuk mengetahui nilai apa yang berada pada urutan paling awal.
4. Empty : Untuk mengetahui apakah stack bernilai kosong atau tidak.
Setelah paham, mari masuk bahasan stack pada bahasa pemrograman Java.
Jadi, stack pada java itu sudah disediakan melalui sebuah frame work yang diimplementasikan dalam sebuah class.
Jadi, java sudah menyediakan sebuah class stack yang siap pakai tanpa perlu dirancang penggunaannya dari awal menggunakan bahasa Java.
Muncul pertanyaan, gimana sih cara pake stack pada java?
Untuk dapat menggunakan stack pada Java maka yang perlu dilakukan adalah import util package.
pada awal baris program java ketik-->
import java.util.Stackl
maka java akan memberikan akses ke dalam class Stack. Selanjutnya adalah menciptakan objeck dari class stack dengan menggunakan perintah operasi sebagai berikut"
Object creation : Stack st=new Stack<>();
Perintah push(),pop(),peek(),empty() dapat dijalankan pada object stack yang telah diciptakan tersebut. Ditambah satu lagi perintah search() yang digunakan untuk mengetahui apakah object stack sudah diciptakan atau belum.
Stack klo diterjemahin artinya itu 'tumpukan'. Bayangkan membeli satu dus shuttlecock (bola bulu tangkis). Klo kita ingin mengerluarkan bola dari dus, maka yang kita ambil adalah bola paling bawah (pop ()). Sedangkan jika kita ingin memasukkan bola dalam tumpukan dus, maka kita memasukkannya dari bagian atas dus (push ()).
BalasHapussaat kita melakukan push (), maka bola yang berada pada urutan paling atas akan terdorong ke dalam, begitu pula bola yang sudah ada di dalam akan semakin terdorong, hingga posisi bola paling luar dan siap dikeluarkan dari dus bola.
Begitupun analogi Stack yang digunakan pada struktur data. LIFO atau Last in first out.
Bagaimana dengan java? di Java kita bisa membuat sebuah alur algoritma program yang sama dengan Stack. Namun, supaya lebih hemat waktu, algoritma stack tersebut sudah disediakan secara langsung oleh java dalam bentuk class. Yang dilakukan cukup import classnya sada pada program yang kita buat, dan setelah diimport class tersebut dapat dipanggil untuk langsung digunakan, itu..
Jika membahas stack itu sendiri, sebenarnya bisa mengacu pada beberapa hal yang berbeda:
BalasHapusStack struktur data : adalah sebuah struktur dari data yang masuk pertama keluar terakhir, yang paling banyak digunakan dalam membangun parser.
Call stack : digunakan oleh runtime environment untuk mempertahankan status eksekusi dan rantai pemanggilan method.
Software stack: merupakan tumpukan perangkat lunak atau teknologi solusi dari sebuah User Interface ke backend database.
dan masih banyak, beberapa pembahasan spesifik lainnya...
Memori Java Stack digunakan untuk mengeksekusi thread, berisi method dengan nilai khusus yang sifatnya sementara dan referensi object lain pada heap yang dirujuk dari method.
BalasHapusDengan tumpukan memori selalu mengikuti aturan LIFO (Last in First Out). Setiap kali method dipanggil, blok baru akan dibuat dalam stack untuk supaya method tersebut dapat menyimpan nilai variabel lokal dan referensi ke object lain dalam method tersebut.
DAFTAR RUJUKAN
BalasHapusLindholm, Tim; Yellin, Frank; Bracha, Gilad; Buckley, Alex (2015-02-13). The Java Virtual Machine Specification (Java SE 8 ed.).