Garbage Collector pada Java das65da5s44
Garbage collector adalah mekanisme JVM untuk menghapus object yang ada di memory kalau sudah tidak dibutuhkan. Garbage collector adalah salah satu feature penting JVM, karena developer tidak lagi perlu secara eksplisit menghapus object dari memory di dalam kode aplikasi. Developer tidak perlu lagi membuat kode untuk menghapus object dari memory seperti di C/C++. Di C/C++ kode yang diperlukan untuk membuat object dan menghapus object dari memory cukup menyita waktu developer, Java menghilangkan kewajiban untuk developer menulis kode penghapusan object dari memory dengan menyerahkan sepenuhnya proses tersebut ke garbage collector. Walaupun begitu, developer tidak terbebas dari praktek yang baik untuk menghindari aplikasi mengalami kehabisan memory (memory leak), error ini ditandai dengan adanya OutOfMemoryException. Garbage Collector bisa juga digunakan sebagai istilah untuk merujuk ke feature managemen memory terotomasi di Java. Pada aplikasi bisnis, setiap kali user melakukan kegiatan di dalam aplikasi, pasti ada object yang dibuat, kemudian dimanipulasi, disimpan di database dan pada akhirnya tidak diperlukan lagi. Menulis kode untuk mengelola memory secara manual bukanlah pekerjaan yang mudah, walaupun tidak bisa diukur secara pasti, usaha yang diperlukan developer bisa dua kali kalau pengelolaan memory dilakukan secara otomatis.
Di dalam java memory digunakan oleh heap, stack, tempat kumpulan variabel java dan tempat hidupnya method. Heap adalah tempat dimana semua object java berada, di tempat inilah Garbage Collector akan melakukan tugasnya, jadi tugas utama dari Garbage Collector adalah memastikan heap mempunyai cukup ruang selama eksekusi aplikasi. Ketika Garbage Collector berjalan, tujuanya hanya satu yaitu menghapus object dalam heap yang sudah tidak digunakan
lagi.
Nah, kemudian pertanyaanya adalah: kapan Garbage Collector berjalan? Garbage Collector dikontrol sepenuhnya oleh JVM. Hanya JVM yang bisa memutuskan kapan Garbage Collector akan berjalan. Dari kode yang kita tulis, ada cara untuk “menganjurkan” Garbage Collector, tetapi tidak ada jaminan bahwa JVM akan langsung mengerjakan anjuran untuk menjalankan Garbage Collector ini. Pada satu waktu bisa saja JVM mematuhi anjuran ini, bisa juga di waktu yang lain tidak dijalankan. Dalam spesifkasi JVM tidak ada jaminan bahwa kalau kita menganjurkan Garbage Collector untuk dijalankan, maka pasti JVM mematuhi anjuran ini. Kita tidak bisa menggantungkan keberhasilan aplikasi kita terhadap kepatuhan JVM atas anjuran kita untuk menjalankan Garbage Collector. Pertanyaan berikutnya adalah : defnisi dari “sudah tidak digunakan lagi” itu apa? Jika suatu object tidak dapat lagi diakses oleh thread yang masih hidup, maka bisa dipastikan bahwa object tersebut sudah tidak bisa digunakan lagi. Object dalam keadaan inilah yang akan dihapus Garbage Collector dari dalam heap. Java akan kehabisan memory kalau aplikasi terus membuat object baru dan object-object tersebut masih bisa diakses oleh thread yang sedang hidup sehingga Garbage Collector tidak bisa menghapus dari heap, sampai pada akhirnya heap penuh. Kita bisa secara sengaja membuat sebuah object tidak bisa lagi diakses dari thread yang masih hidup, cara yang paling mudah adalah dengan mengeset variabel yang memegang reference ke object tersebut menjadi null. Contohnya seperti berikut ini :
Date d = new Date();
d = null;
Setelah variabel d di set ke null maka object Date di atas tidak bisa lagi diakses oleh variabel lainya karena alamat ke object tersebut tidak ada lagi yang tahu. Cara lainya adalah dengan mengganti nilai dari variabel dengan object lain, sehingga object sebelumnya tidak lagi bisa diakses. Contohnya seperti berikut :
Date d = new Date();
d = new Date();
Kode di atas membuat dua buah object dari class Date, object pertama akan dihapus dari heap
ketika Garbage Collector berjalan. Variabel lokal yang dideklarasikan di dalam sebuah method boleh dihapus oleh Garbage Collector kalau eksekusi method selesai. Kalau tidak diperlukan, sebaiknya variabel dideklarasikan di dalam method agar mudah dihapus dari memory. Perhatikan contoh berikut ini :
import java.util.Date;
public class GarbageCollector{
public static void main(String[] args){
Date d = getDate();
//lakukan sesuatu di sini
System.out.println(d);
}
public static Date getDate() {
StringBuffer buffer = new StringBuffer("garbage collectable");
Date date = new Date();
return date;
}
}
Kode di atas terdapat dua buah object di dalam method getDate, object pertama adalah StringBuffer dan object kedua adalah Date. Object StringBuffer bisa dihapus oleh Garbage Collector setelah eksekusi method getDate selesai dilaksanakan, sedangkan object Date tidak bisa dihapus karena referencenya dipegang oleh variabel d di dalam method main. Seperti yang sudah kita bahas, kita bisa “menganjurkan” Garbage Collector untuk berjalan dari dalam kode aplikasi kita. Caranya adalah memanggil method gc dari class System seperti di
bawah ini :
System.gc();
Di dalam JVM tidak ada garansi bahwa setelah method gc dipanggil maka Garbage Collector akan segera berjalan. Ada kalanya Garbage Collector langsung berjalan ada kalanya tidak. Secara praktek, kita tidak perlu memanggil kode ini, kecuali kalau anda membuat aplikasi Java ME. Pemanggilan System.gc() lazim dilakukan dalam aplikasi Java ME, walaupun sebenernya tidak dianjurkan, terutama setelah operasi pembacaan data dari server atau dari media penyimpanan. Mari kita coba sedikit eksperimen untuk mengetes apakah setelah method gc dipanggil Garbage Collector langsung berjalan apa tidak, eksperimen ini melibatkan kode untuk menghitung berapa banyak memory yang tersedia dalam JVM.
import java.util.Date;
public class EksperimenGarbageCollector{
public static void main(String[] args){
Runtime rt = Runtime.getRuntime();
System.out.println("jumlah memory awal : " + rt.totalMemory());
for(int i=0;i < 1000000;i++) {
Date d = new Date();
d = null;
}
System.out.println("jumlah memory tersedia sebelum gc: " + rt.freeMemory());
System.gc();
System.out.println("jumlah memory tersedia setelah gc: " + rt.freeMemory());
}
}
Hasil eksekusi kode di atas sebagai berikut :
$ javac EksperimenGarbageCollector.java
$ java EksperimenGarbageCollector
jumlah memory awal : 85000192
jumlah memory sebelum gc : 76517408
jumlah memory setelah gc : 84240832
$
Dalam kasus di atas setelah eksekusi method gc, Garbage Collector segera berjalan sehingga memory yang digunakan aplikasi menjadi berkurang, ditandai dengan naiknya jumlah memory yang tersedia. Ada istilah stop-the-world ketika kita bicara tentang Garbage Collector, istilah ini digunakan untuk menggambarkan keadaan di dalam JVM dimana semua thread akan berhenti bekerja ketika Garbage Collector berjalan. Gejala yang terlihat adalah aplikasi tiba-tiba berhenti sebentar (pause) dan tidak dapat melayani request dari user. Setelah java 6 diperkenalkan parallel Garbage Collector yang bisa berjalan parallel dan tidak menyebabkan aplikasi mengalami keadaan stop-the-world.
No comments:
Post a Comment