Memahami Penggunaan Memori Di Java


Seorang pembaca bertanya pada saya mengapa jumlah memori yang dipakai oleh aplikasi Java-nya besar sekali.  Ia menjelaskan bahwa ia mengetahui hal ini dengan memakai task manager di sistem operasi Windows.  Sebagai contoh, saya menjalankan sebuah aplikasi Griffon yang memakai plugin simple-jpa, mensimulasikan transaksi faktur dengan data real, lalu membuka task manager:

Tampilan Sebuah Program Java Di Task Manager Windows

Tampilan Sebuah Program Java Di Task Manager Windows

Untuk menjawab pertanyaan ini, saya ingin mengingatkan kembali mengenai Java Virtual Machine (JVM).  Tanpa JVM, program Java (dalam bentuk JAR) tidak akan bisa dijalankan.  Lalu apa itu JVM?  JVM adalah sebuah virtual machine!  Maksudnya?  Coba lihat VirtualBox, Microsoft Virtual PC, VMware , dan sebagainya!  Mereka adalah virtual machine yang mensimulasikan sebuah mesin sehingga pengguna Windows dapat menjalankan Linux atau MacOS di komputer mereka.  Begitu juga sebaliknya, dengan virtual machine, pengguna Mac dapat menjalankan sistem operasi Windows.  JVM bukanlah sebuah virtual machine untuk mensimulasikan OS, tapi konsep dasarnya tidak jauh berbeda, sehingga memungkinkan sebuah program Java dijalankan di berbagai platform berbeda.  JVM adalah virtual machine yang khusus menjalankan bytecode yang merupakan hasil kompilasi dari bahasa pemograman Java, Groovy, Scala, JRuby, Jython, dan sebagainya.

Itu sebabnya pada aplikasi Griffon yang saya jalankan, yang terlihat ada sebuah proses javaw.exe.  Ini adalah JVM, bukan program saya dalam bentuk yang dalam jar.  Dengan demikian, akan tidak fair bila membandingkan sebuah JVM dengan sebuah kode program native (.exe).  Program saya belum tentu memakai memori sebanyak itu!

Sama seperti pengguna VirtualBox atau VMware dapat menkonfigurasi jumlah memori yang dipakai, JVM juga memungkinkan konfigurasi memori.  Tapi sebelumnya, lebih baik saya melihat terlebih dahulu penggunaan memori program saya yang sesungguhnya.  Untuk itu, saya membuka lokasi direktori berikut ini di Windows Explorer: C:\Program Files\Java\jdk1.7.0_21\bin.  Di folder ini saya akan menemukan sebuah program bernama jvisualvm.exe.  Saya segera menjalankan program tersebut.  Java VisualVM adalah program bawaan JDK yang memungkinkan developer untuk melihat penggunaan memori aplikasi Java secara detail.  Pada Local, terdapat daftar virtual machine Java yang sedang berjalan termasuk aplikasi saya.   Saya segera men-double click nama aplikasi saya untuk mulai.

Pada tab Monitor, saya dapat melihat penggunaan CPU dan Heap serta PermGen seperti yang terlihat pada gambar berikut ini:

Tampilan monitor CPU dan Memori

Tampilan monitor CPU dan Memori

Gambar di atas adalah aplikasi yang sudah berjalan 20 menit dalam memproses data transaksi invoice tanpa henti.  Memori Heap adalah memori sementara, misalnya nilai variabel lokal ditampung disini.  Dari 98 MB, heap yang terpakai baru 63 MB.   Dari konfigurasi saya, terlihat bahwa maksimal memori komputer yang boleh dipakai sebagai heap adalah 268 MB.  Nilai ini adalah nilai yang kecil bila dibandingkan dengan jumlah memori komputer zaman sekarang (rata-rata 2 hingga 4 GB).

Pada gambar di atas juga terlihat bahwa garbage collector sempat bekerja menjelang jam 14:40.  Garbage collector adalah fitur Java VM yang akan mencari dan membuang object-object yang sudah tak terpakai lagi.

Selain heap, di Java VM juga ada PermGen.  Ini adalah bagian memori yang khusus untuk menampung data yang permanen, seperti informasi struktur class termasuk nilai variabel statis.

Tampilan monitor PermGen

Tampilan monitor PermGen

Untuk informasi yang lebih detail, saya dapat men-klik tab Sampler.  Lalu saya men-klik tombol Memory.  Disini saya dapat melihat informasi mengenai object-object yang ditampung di heap, seperti yang terlihat pada gambar berikut:

Tampilan Heap Sampler

Tampilan Heap histogram

Selain itu, saya juga bisa melihat informasi yang sama untuk PermGen:

Tampilan PermGen histogram

Tampilan PermGen histogram

Pertanyaan berikutnya, alokasi heap saat ini adalah 99 MB dan alokasi PermGen saat ini adalah 26 MB.  Ingat bahwa dari memori yang dialokasikan, tidak semunya terpakai!  Bila ditotalkan, harusnya adalah 125 MB.  Tapi tampilan di task manager adalah 146 MB.  Kemana sisanya?  Java VM (JVM) juga butuh memori untuk keperluan dirinya sendiri, misalnya untuk menampung class-class di JAR yang dibaca.

Dengan memakai tools Windows seperti Sysinternals Process Explorer, saya bisa melihat riwayat penggunaan memori JVM seperti pada gambar berikut ini:

Performance Graph dari Process Explorer

Contoh Tampilan Performance Graph dari Process Explorer

Apakah saya bisa melihat secara detail penggunaan memori di Java VM?  Sama seperti saat saya melihat secara detail penggunaan memori di aplikasi saya sebelumnya?  Iya, bisa, dengan menggunakan Windows SDK dan syaratnya harus memiliki debugging symbol Java VM.  Hal ini bukanlah hal yang menarik untuk dilakukan, apalagi dari gambar di atas tidak terlihat ada kebocoran memori.

Kesimpulannya:  Penggunaan memori untuk aplikasi Java memang lebih besar dibandingkan dengan aplikasi native (exe).  Akan tetapi jumlah pemakaiannya tidak terlalu berlebihan dan masih dalam batas kewajaran (ditambah lagi dengan trend hardware zaman sekarang yang mendukung virtualisasi dan cloudisasi), terutama bila dibandingkan dengan kelebihan Java: kemudahan pengembangan dan portabilitas.

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: