Memahami Java Virtual Machine

Giovanni Sakti
AbstractLayers
Published in
3 min readJan 22, 2018

--

Ada kesalahpahaman yang sering terjadi mengenai JavaScript dan bahasa pemrograman Java (javalang). Banyak yang mengira kedua teknologi tersebut terkait, meskipun hal tersebut tidak benar (satu-satunya keterkaitan adalah kemiripan nama).

Kemudian ada teknologi lain yang juga sering dikaitkan dengan javalang namun akhir-akhir ini teknologi tersebut makin terpisah dari javalang, yaitu Java Virtual Machine (JVM).

Untuk memahami lebih lanjut mengenai JVM, kita perlu mengetahui terlebih dahulu sejarahnya. JVM dibuat sebagai solusi akan salah satu kebutuhan javalang, yaitu portability. Di awal era 90an, opsi yang umum untuk mengeksekusi bahasa compiled adalah dengan terlebih dahulu melakukan kompilasi menjadi kode yang dapat dibaca komputer. Maka apabila terdapat lebih dari satu komputer dengan spesifikasi yang berbeda, proses kompilasi perlu dilakukan ulang untuk tiap komputer. Jadi apabila kita menginginkan portability, kita harus menggunakan bahasa interpreted dengan dampak penurunan performa yang signifikan.

Sebagai solusi terhadap permasalahan tersebut, maka dibuatlah JVM. JVM adalah sebuah abstract virtual machine yang digunakan sebagai target kompilasi dari javalang. Hal ini berarti javalang tidak dikompilasi menjadi bahasa komputer melainkan menjadi kode yang dapat dipahami JVM. Jika sudah pernah menggunakan javalang sebelumnya, kita menggunakan compiler javac untuk keperluan tersebut.

James Gosling, founder dan lead designer javalang (termasuk JVM)

Kode yang dapat dipahami oleh JVM disebut Java bytecode yang tidak lain merupakan Intermediate Representation (IR) dari kode javalang kita. Java bytecode ini portable, yaitu dapat dipindahkan ke komputer dengan spesifikasi yang berbeda-beda untuk langsung dieksekusi tanpa proses kompilasi ulang.

Jika familiar dengan .NET, mereka juga memiliki virtual machine yang cara kerjanya mirip dengan JVM disebut Common Language Runtime (CLR). Sehingga dapat disimpulkan bahwa teknik eksekusi kode seperti ini tidak hanya eksklusif di dunia Java.

Komponen pada JVM

Sebagai target kompilasi dan virtual machine, JVM memiliki arsitektur yang mirip dengan komputer kita. Sebagai contoh JVM memiliki sistem manajemen memori dan register.

JVM memiliki 3 komponen penting:

  1. Class Loader
  2. Runtime Data Area
  3. Execution Engine

Java bytecode disimpan di komputer kita pada file dengan ekstensi *.class. Oleh karena itu, komponen pertama pada JVM bertanggung jawab untuk membaca dan memuat seluruh file *.class. Komponen tersebut juga bertanggung jawab memverifikasi bytecode yang dimuat valid dan melakukan proses resolving terhadap seluruh referensi statik.

Runtime data area bertanggung jawab dalam menyimpan seluruh kelas, obyek, fungsi, variabel dan data. Komponen ini menyerupai memori pada komputer kita. Namun komponen ini juga memiliki PC registers sebagai sub-komponen, yang menyimpan alamat dari instruksi yang sedang dieksekusi (mirip dengan register pada CPU di komputer kita).

Terakhir, execution engine merupakan komponen yang sangat krusial dan berperan dalam melakukan proses eksekusi terhadap bytecode. Komponen ini terdiri dari interpreter, just-in-time compiler (JIT Compiler) dan garbage collector.

Mungkin ada pertanyaan kenapa JVM memiliki compiler dan interpreter sekaligus. Pada versi awal JVM, execution engine hanya memiliki interpreter untuk mengeksekusi bytecode. JIT compiler kemudian ditambahkan pada versi lanjut untuk meningkatkan performa. Saat ini JVM dapat meningkatkan performa secara dinamis dengan mengidentifikasi fungsi yang sering digunakan pada aplikasi kita. JVM kemudian mengalihkan fungsi tersebut kepada JIT compiler untuk dikompilasi sebagai ganti proses interpretasi oleh interpreter. Hal inilah yang menyebabkan performa JVM dapat meningkat signifikan apabila diberikan waktu untuk melakukan pemanasan (warm-up).

Bahasa JVM

Dari sudut pandang teknis, JVM memahami java bytecode namun sebenarnya tidak memahami javalang sama sekali. Itulah kenapa javalang dan JVM dapat dianggap sebagai entitas yang terpisah. Bahkan ketika JVM semakin populer, fiturnya semakin lengkap dan performanya sudah semakin baik, mulai bermunculan bahasa pemrograman selain javalang yang dapat dikompilasi menjadi java bytecode. Beberapa contoh yang paling dikenal diantaranya Scala, Kotlin, Clojure, JRuby dan Jython.

Ringkasan

  1. JVM merupakan abstract virtual machine yang dapat berjalan pada komputer kita
  2. JVM berperan sebagai target kompilasi dari bahasa JVM. Bahasa JVM pertama yang diciptakan adalah javalang.
  3. JVM memahami dan dapat mengeksekusi java bytecode.
  4. JVM memiliki 3 komponen utama: class loader, runtime data area dan execution engine. Sebagai virtual machine, JVM memiliki arsitektur yang menyerupai komputer kita.
  5. Terdapat bahasa selain javalang yang dapat dikompilasi menjadi java bytecode, dikenal sebagai bahasa JVM.

--

--

Giovanni Sakti
AbstractLayers

Current: Engineering Management & Leadership, Consultant, Livestream (ID) insinyur.online, Nonprofit (ID) deeptech.id | bio.link/giosakti