Kepada pengunjung Yang Terhormat

Saya harap anda bahagia dengan postingan di Blog ini. anda senang,saya Melayang

Sunday, 24 January 2021

Garbage Collector pada Java das65da5s44

 

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

iklan popcash