Tanya Garbage Collector

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Tanya Garbage Collector

rizki   yuwanda
Dear all,Mohon maaf bila repost, jadi gini, setahu saya kan aplikasi
java akan out of memory error apabila java heap tidak dapat menampung
lagi object yang terlalu banyak dibuat, lalu saya bikin contoh project
yang sederhana dan memiliki methode seperti ini :
private void javaMemory() {        final int MegaBytes = 1024102;      
long freeMemory = Runtime.getRuntime().freeMemory() / MegaBytes;      
long totalMemory = Runtime.getRuntime().totalMemory() / MegaBytes;
long maxMemory = Runtime.getRuntime().maxMemory() / MegaBytes;
         System.out.println("JVM freeMemory: " + freeMemory);      
System.out.println("JVM totalMemory also equals to initial heap size of
JVM : " + totalMemory);        System.out.println("JVM maxMemory also
equals to maximum heap size of JVM: " + maxMemory);

         ArrayList objects = new ArrayList();
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }
         for (int i = 0; i < 10000000; i++) {            objects.add((""
+ 10 * 2710));        }

         freeMemory = Runtime.getRuntime().freeMemory() / MegaBytes;
totalMemory = Runtime.getRuntime().totalMemory() / MegaBytes;      
maxMemory = Runtime.getRuntime().maxMemory() / MegaBytes;
         System.out.println("Used Memory in JVM: " + (maxMemory -
freeMemory));        System.out.println("freeMemory in JVM: " +
freeMemory);        System.out.println("totalMemory in JVM shows current
size of java heap : " + totalMemory);      
System.out.println("maxMemory in JVM: " + maxMemory);    }
setelah saya jalankan aplikasi dan dimonitor lewat VisualVM, ternyata
heap yang digunakan sangat tinggi dan tidak pernah turun lagi tetapi
setelah saya tekan tombol perform GC di VisualVM ternyata heap nya
turun, nah pertanyaan saya gimana caranya VisualVM tersebut dapat
menurunkan heap tersebut  ya? kalaupun dari kode yang harus dibenarkan
seharusnya gimana ya agar kode tersebut dapat out of scope dan di hapus
oleh GC.
Oh iya pada project ini sengaja saya naikin memory nya jadi 1GB.
Terima kasih

Reply | Threaded
Open this post in threaded view
|

Re: Tanya Garbage Collector

Endy Muhardin
On Wed, Dec 12, 2012 at 9:07 AM, Rizki Yuwanda <[hidden email]>wrote:

> **
>
>
> Dear all,
> Mohon maaf bila repost, jadi gini, setahu saya kan aplikasi java akan out
> of memory error apabila java heap tidak dapat menampung lagi object yang
> terlalu banyak dibuat
>
> setelah saya jalankan aplikasi dan dimonitor lewat VisualVM, ternyata heap
> yang digunakan sangat tinggi dan tidak pernah turun lagi tetapi setelah
> saya tekan tombol perform GC di VisualVM ternyata heap nya turun, nah
> pertanyaan saya gimana caranya VisualVM tersebut dapat menurunkan heap
> tersebut  ya? kalaupun dari kode yang harus dibenarkan seharusnya gimana ya
> agar kode tersebut dapat out of scope dan di hapus oleh GC.
>

GC itu bekerjanya kalau perlu saja.
Walaupun pakai memori sudah banyak, tapi kalo JVM merasa belum perlu, dia
tidak akan jalankan GC.
GC juga ada beberapa jenis, ada yang kecil-kecilan, dan ada yang
besar-besaran.
Yang kecil dijalankannya relatif lebih sering, sedangkan yang besar kalo
gak kepepet gak dijalankan,
soalnya bikin lemot, mirip seperti jaman dulu kita mendefrag harddisk.

Di contoh kamu barusan, gak keliatan siapa yang memanggil method
javaMemory-nya, dan kapan kamu perform GC.
Kalau perform GC dilakukan setelah method javaMemory selesai, ya tentu
object ArrayList tersebut sudah out of scope sehingga bisa disapu.

Gimana tipsnya supaya GC bisa bekerja dengan baik?
Satu aja yang harus diingat : deklarasikan variabel dengan scope sekecil
mungkin.
Kalau bisa dalam loop/conditional, jangan lakukan diluar loop/conditional.
Kalau bisa di dalam method, jangan dijadikan instance variable.
Kalau bisa jadi instance variable, jangan jadikan static variable.

Dengan demikian, dia bisa cepat out-of-scope sehingga bisa cepat disapu
oleh GC.

Endy Muhardin
http://software.endy.muhardin.com