Selasa, Maret 05, 2019

Fungsi Java Virtual Machine Pada Bahasa Pemrograman Java

Java Virtual Machine (JVM) bertindak sebagai runtime engine untuk menjalankan aplikasi Java. JVM adalah yang memanggil main method dalam program Java. JVM adalah bagian dari Java Runtime Environment (JRE).

Aplikasi Java disebut juga dengan WORA (Write Once Run Anywhere). Artinya, aplikasi Java hanya perlu dikembangkan sekali pada sistem dan dapat dijalankan pada sistem Java yang lain tanpa harus melakuan pengaturan ulang tertentu. Kemampuan Java untuk bisa berjalan diberbagai sistem ini karena kemampuan dari JVM.

Ketika Java file dikompilasi, maka class files yang mengandung bytecode akan menghasilkan  file yang sama dengan nama class pada .java file oleh compiler. Pada tahap kompilasi ini .class file akan mengalami beberapa tahapan proses ketika dijalankan. Beberapa proses tersebut diperlihatkan pada gambar 1.


tahap-tahap kompilasi file java yang dilakukan menggunakan java virtual machine
Gambar 1 tahap kompilasi file java dengan jvm
sumber gambar : geeksforgeeks.org

Class Loader Subsystem, bertanggung jawab terhadap tiga aktifitas, yaitu: loading, linking, dan initialization (inisialisasi).

Loading:
Class Loader membaca file .class, kemudian menghasilkan data biner dan menyimpannya sesuai dengan area method. Untuk setiap file .class, JVM menyimpan beberapa informasi pada area method.
satu, Nama kualifikasi penuh dari class loading dan class parent terdekatnya.
dua, Apakah .class file terhubung dengan Class, Interface, atau Enum.
tiga, Modifier, Variabel, Method, dan lain sebagainya.

Ketika JVM telah melakukan loading .class file, selanjutnya JVM menciptakan class tipe untuk menampilkan file tersebut ke dalam memori heap. Perlu diingat bahwa objek dari tipe class yang dimaksud adalah predefinisi dari java.lang pada package. Objek class dapat digunakan oleh programmer untuk mendapatkan informasi class level seperti nama class, nama parent, method, variabel, dan lain sebagainya. Untuk mendapatkan informasi dari class tersebut maka menggunakan perintah getClass() method dari objek class.

contoh program:

catatan: class objek hanya tercipta satu kali setiap class file melakukan loading.

Linking:
terdiri dari tiga tahap yaitu: verifikasi, persiapan, dan resolution (optional).
satu, Verifikasi adalah memastikan .class file sudah diperiksa secara benar dan apakah file sudah di format dan dihasilkan dengan benar oleh compiler. Jika proses verifikasi gagal makan runtime exception akan menjalankan java.lang.VerifyError.
dua, Persiapan atau preparation adalah JVM mengalokasikan memori untuk variabel class dan menginisialisasi memori ke dalam nilai default.
tiga, Resolution adalah proses penggantian referensi simbol dari ketikkan ke referensi langsung. Proses resolusi dilakukan dengan cara mencari ke area method untuk menemukan referensi entitas.

Initialization:
Pada tahapan initialization atau inisialisasi semua variabel static akan ditugaskan sesuai dengan nilai yang telah terdefinisi pada kode program dan static block (jika ada). Proses dijalankan mulai dari tahap paling atas ke bawah (top-bottom) dan dari parent ke child dalam class hirarki.

Bootstrap class loader: Setiap implementasi JVM memiliki bootstrap class loader yang mampu melakukan loading ke class yang terpercaya. JVM melakukan loading ke pusat class Java API yang ditampilkan dalam JAVA_HOME/jre/lib directory. Jalur ini lebih populer dengan sebutan jalur bootstrap. Hal ini juga diimplementasikan pada bahasa native lain seperti C, dan C++.

Extension class loader: merupakan turunan (child) dari bootstrap class loader. Extention class loader menampilkan direktori ekstensi JAVA_HOME/jre/lib/ext (jalur ekstensi) atau direktori spesifik lainnya dari jalur class aplikasi (application class path). Application class loader digunakan secara internal pada variabel lingkungan yang dipetakan ke java.class.path. Application class loader juga diimplementasikan dalam Java oleh class sun.misc.Launcher$AppClassLoader.

contoh program:

catatan:
JVM mengikuti aturan hirarki perwakilan dalam melakukan loading class. System class loader mewakilkan loading request menuju extention class loader dan extension class loader mewakilkan request-nya ke bootstrap class loader. Jika ditemukan jalur class pada bootstrap maka class akan di-loading ketika tidak ada request transfer lain ke extension class loader, dan kemudian akan menuju ke system class loader. Terakhir, jika class loader gagal melakukan loading class, maka akan didapati runtime exception java.lang.ClassNotFoundException. Gambar 2 memperlihat proses tersebut secara bertahap.

tahapan loading class java dengan menggunakan java virtual machine
Gambar 2: loading class java
sumber gambar : geeksforgeeks.org

JVM Memori
Method area: mengandung semua level informasi class seperti class name, parent terdekat dari class name, informasi method dan variabel, dan lain sebagainya. Hanya terdapat satu area method pada setiap JVM dan method tersebut merupakan shared resource.

Heap area: Semua informasi objek disediakan di heap area. Hanya terdapat satu heap area pada setiap JVM yang juga merupakan shared resource.

Stack area: JVM menciptakan satu runtime stack yang disediakan untuk setiap thread. Setiap block pada setiap stack disebut sebagai activation record atau stack frame yang menyediakan method calls. Semua variabel lokal dari setiap method tersebut disediakan pada frame yang sesuai. Setelah thread dimatikan (terminate), maka runtime stack-nya pun akan dimatikan oleh JVM dan bukan merupakan shared resource.

PC registers: adalah alamat penyedia dari instruksi eksekusi sebelumnya dari thread. Pada dasarnya, setiap thread terpisah dari PC registers.

Native method stacks: untuk setiap thread diciptakan stack native secara terpisah yang menyediakan informasi native method.

Penjelasan tentang JVM memori diperlihatkan pada gambar 3.

gambar JVM memori pada bahasa pemrograman Java
Gambar 3 JVM Memori
sumber gambar : geeksforgeeks.org

Execution Engine
Execution engine melakukan eksekusi atau menjalankan .class (bytecode) dengan cara membaca kode baris per baris, menggunakan data, dan menampilkan informasi dari berbagai area memori, dan perintah eksekusi. Hal tersebut dapat dibagi kedalam tiga bagian yaitu:

satu, Interpreter: Interpreter berfungsi untuk menginterpretasikan tiap-tiap baris bytecode dan kemudian mengeksekusinya atau menjalankannya. Kekurangan dari interpreter adalah pada saat suatu fungsi dipanggil secara berulang maka maka interpreter pun akan dipanggil secara berulang pula.

dua, Just-in-Time Compiler (JIT): JIT digunakan untuk meningkatkan efisiensi dari interpreter. JIT melakukan kompilasi terhadap seluruh bytecode dan mengubahnya menjadi native code dimanapun interpreter melihat pemanggilan method secara terpisah, maka JIT menyediakan native code untuk bagian tersebut sehingga tidak diperlukan interpretasi secara berulang.

tiga, Garbage Collector: Garbage Collector berfungsi untuk menghancurkan objek yang tidak berfungsi.

Java Native Interface (JNI)
JNI adalah intarmuka (interface) yang berinteraksi dengan Native Method Libraries dan menyediakan native libraries (C/C++) untuk proses eksekusi. JNI memungkinkan JVM untuk memanggil C/C++ libraries dan sebaliknya untuk dipanggil oleh C/C++ untuk kebutuhan khusus pada hardware.

Native Method Libraries
Native method libraries adalah kumpulan dari Native Libraries (C dam C++) yang dibutuhkan oleh Execution Engine.





Related Posts

Fungsi Java Virtual Machine Pada Bahasa Pemrograman Java
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "