in Java

Heap Dump nasıl yapılır?

Şu yazıda Heap Dump nedir, neden ihtiyacımız var gibi sorulara cevap vermiştim.Bu yazıya başlamadan önce göz atmakta fayda var.

İki şekilde Heap Dump alma yöntemini inceleyeceğiz. İlki hali hazırda çalışıyor olan bir Java programının Heap Dump ile çıktısını alma yöntemidir.

Bunun için Linux’ta terminali açıyoruz. top yazarak Java uygulamamızın sahip olduğu PID değerini öğreniyoruz. Ardından aşağıdaki komutu terminal aracılığıyla çalıştırıyoruz.

Komut şunun gibi bir çıktı verecektir;

Çıktımıza belirtilen klasörden ulaşabiliriz.

Bir diğer yöntem ise bellek dolduğu an JVM’in bizim için bir Heap Dump çıktısı üretmesidir.Bunu da vereceğimiz JVM argümanları ile gerçekleştirebiliriz.Aşağıdaki kodları Eclipse için anlatmak gerekirse Run -> Run Configurations -> Arguments -> VM Arguments kısmına yazıyoruz.

Tabi böyle ezbere argüman yazarak ne yaptığımızı anlamadan iş yapmak pek mantıklı değil. O nedenle şu adresten JVM’in bize sunduğu bir takım argüman listesine ve açıklamalarına erişebilirsiniz. Bu yöntem ile bellek dolduğu an bir heap çıktısını projenin olduğu klasörde bulabiliriz.

İlk yöntemi herhangi bir Java programı çalışırken test edip çıktısını alabiliriz.Fakat, İkinci yöntemi test edip görmek için belleği dolduran bir koda ihtiyacımız var.

Bir proje açıp bu kodu main metodunun olduğu sınıfa yapıştırıyoruz. Daha sonra yukarda anlatıldığı gibi VM argümanlarını ekliyoruz.

Burada ek olarak -Xmx64m argümanını ekledik.Bu JVM’in ayıracağı heap bölgesinin boyutunu 64 MB olarak ayarlıyor.Böylece az olan bellek alanı kodumuzun kontrolsüz nesne üretimiyle beraber çabucak dolacak.Biz de ihtiyacımız olan heap çıktısını almış olacağız.

Peki bu çıktıları nasıl anlamlı bir şekilde görebilir ve analiz edebiliriz? 

Burada devreye bir Eclipse aracı giriyor. Eclipse MAT aracını kullanarak elimizdeki heap çıktısını gerek grafiksel gerek satır satır inceleyebiliyoruz. Eclipse Marketplace aracılığıyla kurulumu hızlıca yapabilirsiniz. Ardından Window -> Perspective -> Open Perspective -> Memory Analysis seçiyoruz. Sol üstte bulunan Open Heap Dump’ı seçip çıktımızı işaretleyip onaylıyoruz.

Böylelikle bellekte neler olmuşsa detaylıca görebiliyoruz.String kullandığımız için char dizilerinin belleği şişirdiğini görebiliyoruz. HashMap de ikinci sırada görünüyor.

heapdump1

Overview sekmesinde ise görüldüğü üzere 166,500 nesne oluşturulduğunu görüyoruz. bu nesneleri saniyeler içerisinde oluşturdu. Referanssız bırakılmadığı içinde belleği şişirdi.

heapdump2

 

Ayrıca anlık Heap görüntüsünü izleyebilmek için VisualVM programını bilgisayarınıza kurarak Java programlarınızı takip edebilirsiniz.

visualvm

Yorum yaz

Comment