Lompat ke konten Lompat ke sidebar Lompat ke footer

Java Virtual Machine dan Fungsinya

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


Sebelum mempelajari materi tentang Java Virtual Machine dan Fungsinya, terlebih dahulu pelajari materi tentang: Cara Membangun Lingkungan Pengembangan Java, Membuat Program Hello World Java, dan Sistem Penamaan Bahasa Pemrograman Java.

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 pada perangkat tersebut. Kemampuan Java untuk bisa berjalan diberbagai sistem ini adalah 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 kompilator. Pada tahap kompilasi ini .class file akan mengalami beberapa tahapan proses ketika dijalankan. Beberapa proses tersebut diperlihatkan pada gambar 1. Tujuan Penggunaan Bytecode pada Java adalah Java menjadi platform yang independen dan aman (David J. 2014).

Class Loader Subsystem, bertanggung jawab terhadap tiga aktifitas, yaitu: loadinglinking, 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 yang terdiri dari beberapa hal berikut, yaitu:
  • Nama kualifikasi penuh dari class loading dan class parent terdekatnya.
  • .class file tersebut terhubung dengan ClassInterface, atau Enum.
  • ModifierVariabelMethod, 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 parentmethod, variabel, dan lain sebagainya. Untuk mendapatkan informasi dari class tersebut maka digunakan perintah getClass() method dari objek class.

Contoh:

/* Program java memperlihatkan class tipe bekerja diciptakan oleh JVM .class file untuk ditampilkan pada objek memori */

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

/* Kode Java menampilkan fungsi class objek melalui JVM */

/* nama class dibuat sesuai nama file program atau project */

public class JavaApplication4

{

 

public static void main(String[] args)

{

/* ciptakan class baru dengan nama s1 dengan tipe data Student oleh JVM Student adalah class dengan tipe data class */

Student s1 = new Student();

 

/* Ciptakan class baru dengan nama c1 yang nilainya ditransfer dari class s1 */

Class c1 = s1.getClass();

 

/* cetak objek bertipe teks dan tampilkan pada layar monitor yang datanya diambil dari objek class c1.getName() */

System.out.println(c1.getName());

 

/* ciptakan method array baru dengan nama m [] bertipe data method yang nilainya diambil dari class c1 */

Method m[] = c1.getDeclaredMethods();

for (Method method : m)

System.out.println(method.getName());

 

/* mendapatkan nilai f[] dengan tipe data field dari class c1 */

Field f[] = c1.getDeclaredFields();

for (Field field : f)

System.out.println(field.getName());

}

 

}

 

/* Contoh class yang dibuat dengan nama Student dan tipe data class yang akan digunakan pada main method diatas */

class Student

{

private String name;

private int roll_No;

 

public String getName() { return name;

}

public void setName(String name) { this.name = name; }

public int getRoll_no() { return roll_No; }

public void setRoll_no(int roll_no)

{

this.roll_No = roll_no;

}

 

}

Output:
Student
getName
setName
getRoll_no
setRoll_no
name
roll_No

Catatan: class objek hanya tercipta satu kali setiap class file melakukan loading.
Student s2 = new Student();
// c2 akan menuju ke object yang sama dimana c1 dituju 
Class c2 = s2.getClass();
System.out.println(c1==c2); // true

Baca Juga:

Linking:

Terdiri dari tiga tahap yaitu: verifikasi, persiapan, dan resolution (optional).
  • Verifikasi adalah memastikan .class file sudah diperiksa secara benar atau belum, dan apakah file tersebut sudah di format dan dihasilkan dengan benar oleh kompilator. Jika proses verifikasi gagal, maka runtime exception akan menjalankan java.lang.VerifyError.
  • Persiapan atau preparation adalah proses dimana JVM mengalokasikan memori untuk variabel class dan menginisialisasi memori ke dalam nilai default.
  • 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 dilakukan inisialisasi semua variabel static yang ditugaskan sesuai dengan nilai yang telah terdefinisi pada kode program dan static block (jika ada). Proses tersebut 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 direktori JAVA_HOME/jre/lib. Jalur ini lebih populer dengan sebutan jalur bootstrap.
  • Extension class loader: merupakan turunan (child) dari bootstrap class loaderExtention 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.pathApplication class loader juga diimplementasikan dalam Java oleh class sun.misc.Launcher$AppClassLoader.

Contoh:

/* Kode Java menampilkan Class Loader subsystem */

public class PercobaanJVM

{

 

public static void main(String[] args)

{

/* loading class string oleh bootstrap loader, dan bootstrap loader bukanlah objek Java, oleh karena ini bernilai null */

System.out.println(String.class.getClassLoader());

 

/* Loading JavaApplication4 oleh aplikasi loader */

System.out.println(JavaApplication4.class.getClassLoader());

}

 

} 

Output:
null
sun.misc.Launcher$AppClassLoader@73d16e93

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

JVM Memori:

  • Method area: mengandung semua level informasi class seperti class nameparent 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 bagian dari 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.

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:
  • 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 interpreter pun akan dipanggil secara berulang pula.
  • 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.
  • 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.

7 komentar untuk "Java Virtual Machine dan Fungsinya"

  1. Balasan
    1. David J. Eck, Introduction to Programming Using Java, Seventh Edition, Version 7.0, August 2014 at Section 1.3 "The Java Virtual Machine"

      Hapus
  2. JVM itu bertugas sebagai mesin yang menjalankan aplikasi Java. JVM merupakan satu-satunya yang benar-benar melakukan pemanggilan main method pada kode program Java. JVM merupakan bagian dari JRE.

    Aplikasi Java disebut juga WORA atau Write Once Run Anywhere. Maksud dari istilah tersebut adalah setiap program yang telah dibuat oleh seorang programmer dalam sebuah sistem juga bisa dijalankan pada sistem lainnya dimana pada sistem tersebut sudah terpasang JVM.

    BalasHapus
  3. JVM itu merupakan kepanjangan dari Java Virtual Machine.

    Sejak masa dimana setiap sistem komputer yang dikembangkan sudah mampu menciptakan sebuah program.

    Contoh, jika kita mengembangkan program bahasa C atau C++ dan menjalankan program tersebut pada Windows maka program tersebut sifatnya tidak dapat berdiri sendiri, atau hanya dapat dijalankan pada OS windows itu saja atau pada sistem itu saja.

    Namun pada bahasa pemrograman Java, JVM dapat mengambil alih pembuatan class file yang berkaitan dengan berbagai program (Java) dan dapat membuat program tersebut digunakan pada berbagai OS.

    JVM juga bertindak sebagai interface atau antarmuka antara OS dan kode program yang dijalankan.

    BalasHapus
  4. JVM memungkinkan pendistribusian program kompilasi Java tanpa adanya aturan pembatasan penggunaan dari kode biner atau library hanya terbatas pada satu jenis arsitektur kompoter saja, tapi bisa digunakan oleh berbagai jenis arsitektur komputer seperti Window dalam Intel, Linux dalam Inter, AMD, AIX dalam PowerSystem, dan lain sebagainya.

    BalasHapus
  5. JVM membuat pengembang lebih mudah dalam membuat dan melakukan perawatan proram. Pada bahasa pemrograman lain (selain Java), kode program telah dibuat biasanya dikompilasi ke kode native, kemudian setelah dilakukan proses tersebut pengembang harus memutuskan jenis prosesor dan arsitektur komputer mesin jenis apa yang akan digunakan untuk kompilasi program, dan juga harus melakukan beberapa pemilihan lain untuk mengoptimalkan penggunaan kode program. Namun dengan JVM, kompilator akan langsung dapat menghasilkan "byte code" yang sudah langsung diterjemahkan ke kode native beberapa saat sebelum program dijalankan, dan pengoptimalan kode program dipilih otomatis berbadasrkan bagaimana program tersebut berjalan pada suatu sistem.

    JVM juga membantu memberikan keamanan pada waktu proses dengan analisis kode yang digunakan untuk memeriksa instruksi yang tidak valid ataupun juga terhadap beberapa masalah keamanan program saat dijalankan pada suatu sistem komputer.

    BalasHapus
  6. JVM digunakan untuk menjalankan byte code yang telah dikompilasi oleh bahasa seperti Java, Groovy, Scala, Clojure, dan Kotlin. Hal ini memungkinkan terjadinya suatu kemandirian platform, yang sejalan dengan filosofi "write one, run anywhere" atau WORA.

    JVM sangat populer pengembangannya karekan ekosistem librarisnya yang banyak, dan framework yang dapat digunakan juga sangat banyak. Inilah alasan mengapa begitu banyak bahasa pemrograman yang diciptakan untuk dapat mengekploitasi ekosistem pengembangan tersebut. Selain bahasa program yang telah disebutkan sebelumnya, beberapa bahasa pemrograman lain juga turut mengembangkan ekosistem untuk bisa juga dijalankan pada JVM seperti Jtyhon, JRubu, Redline Smalltalk, Jabaco (Visual Basic), Renjin (R), Rakudo Perl 6, Armed Bear Common Lisp, Kawa (Scheme), dan lain sebagainya.

    BalasHapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -
- Big things start from small things -