Java Virtual Machine(JVM) Parameters 1
Java Virtual Machine serilerine derinlemesine devam ediyoruz.Aşağıdaki bağlantılarda JVM ile ilgili serinin önceki yazılarına ulaşabilirsiniz.
Java Virtual Machine(JVM) Architecture 1 makalesine buradan erişebilirsiniz.
Java Virtual Machine(JVM) Architecture 2 makalesine buradan erişebilirsiniz.
Java Virtual Machine(JVM) Architecture 3 makalesine buradan erişebilirsiniz.
Java Virtual Machine(JVM) Architecture 4 makalesine buradan erişebilirsiniz.
JVM Parametreleri
Java core konuları arasına yer alan önemli konulardan birisi de “JVM Parametreleri” hakkında kapsamlı bilgi sahibi olmaktır. Özellikle java ara katman yazılımları üzerinde çalışıyorsanız,JVM parametrelerinin ne anlama geldiğini,önemlerini ve yazılımınızı nasıl etkilediklerini bilmeniz faydalı olacaktır.
JDK Build serisini yazarken,build ile ilgili bazı JVM parametrelerini incelemiştik. Bu makalede ise genel olarak kullanabileceğimiz(daha iyi performans,hata yakalama-ayıklama,garbage collection(çöp toplayıcı) vb.) önemli JVM parametlerini inceleyeceğiz.
Giriş
JVM parametrelerini incelemeye başlarken bilmemiz gereken en önemli husus,paremetre tip-türleri hakında bilgi sahibi olmaktır. JVM parametreleri aşağıdaki türlere sahiptir.
-Standard(Standart)
-Non-Standard(Standart olmayan)
-Advanced(Gelişmiş)
Parametre kullanırken,hangi tür parametre kullandığımızı belirtmemiz gerekir. Dolayısıyla kullanılacak parametrede tür belirtmek,ilgili parametre üzerinde komut değişikliği oluşturur.Tür,parametre komutu başına eklenerek belirtilir. Eğer Standard(Standart) türde bir parametre kullanıyorsak komutun başına herhangi bir belirteç eklememiz gerekmez.
Ancak eğer Non-Standard(Standart olmayan) bir tür kullanıyorsak,bu durumda parametrenin başına “-X” eklememiz gerekir. Eğer Advance(Gelişmiş) türden bir parametre kullanıyorsak, o halde parametre başına “-XX” eklememiz gerekir. Dolayısıyla bu belirteçlerle parametremizin tür seviyesi hakkında JVM’e bilgi vermiş oluruz.
Uygulamamız Tarafından Kullanılan JVM Paramtreleri
Uygulama linux üzerinde çalışıyorsa aşağıdaki komutu kullanarak process ve process argümanları JVM seçeneklerine görebilirsiniz.
ps -ef | grep java
Ancak sistemde bir fazla java process bulunuyorsa,bu durumda java uygulamanıza özgü bir anahtar kelime girmeniz gerekebilir. Aşağıdaki görünümde “chrome” anahtar kelimesiyle inceleme yapılıyor.
Komut:
ps -ef | grep chrome
Uzun argümanlar için aşağıdaki komut ile daha detaylı bir liste alınabilir.
ps -auxww
Java Yığın Boyutu
Bu parametreler en temel kullanılan parametrelerdir. Geliştirdiğimiz uygulamalar çeşitli kısıtlı kaynaklara sahip olabilir. Örneğin iot ve benzeri kaynaklara sahip donanımlara yönelik geliştirmeler yapıyor olabiliriz.Bu gibi durumlarda kaynakları doğru ve etkili kullanmak zorundayız. Dolayısıyla bu parametreler en temel halde işimizi görecektir.
Aşağıda verilen üç adet parametre ile yığın boyutunu ayarlayabiliriz.
-Xms //JVM başlarken alacağı minimum memory değeri.
-Xmx //JVM çalışma sırasında alacağı maksimum memory değeri.
-Xss //Java thread(iş parçacığı) memory değeri.
Bu parametreleri biraz daha detaylandıralım.
-Xms: Bu paramtre,JVM için başlangıç yığın boyutunu tanımlamak için kullanabiliriz.Örnek kullanım:
-Xms2048m
Bu kullanımda JVM’nin başlangıç yığın boyutu 2GB olarak ayarlanmıştır. Dolayısıyla JVM start aldığında yığın boyutu bu büyüklükte olacaktır.
- Xmx: Bu paramtre,JVM’nin maksimum yığın boyutunu ayarlamak içindir.Dolayısıyla JVM çalışırken bu parametre ile belirtilen miktar üzerinde çalışmasını sürdürecektir.
Örnek kullanım:
-Xmx2048m
Bu kullanımda JVM’nin çalışmasını sürdürdüğü ve sürdüreceği alan boyutu 2GB olarak ayarlanmıştır.
Esasen bu üç parametreden ilk ikisi(-Xms ve -Xmx) genellikle birlikte kullanılır. Ancak çok ince ayarlarla çalışıyorsak bunu söylemek zordur.
Yığın Yüzdesi(%)
İkinci olarak en temel ve en önemli parametrelerin arasında bellek yönetimi ile ilgili parametler yer alır.Bu parametreler GC(çöp toplayıcısı) üzerinde etkilidir.
Aşadağıda verilen parametre ile serbest bırakılan-sisteme iade edilen minimum yığın oranı yüzdelik olarak ayarlanabilir.
-XX:MinHeapFreeRatio//Örnek kullanım:
-XX:MinHeapFreeRatio=15
Aşadağıda verilen parametre ile serbest bırakılan-sisteme iade edilen maksimum yığın oranı yüzdelik olarak ayarlanabilir.
-XX:MaxHeapFreeRatio
//
Örnek kullanım:
-XX:MaxHeapFreeRatio=85
Dolayısıyla bu kullanım örneğinde,%85'den fazla memory serbet bırakılmayacak,sisteme iade edilmeyecektir.
Class Veri Paylaşımı
Bu parametre,içinde önbellek tahsis etme(Bkz:Java Yığın Boyutu) parametreleri de bulunan bir dizi parametre alabilir.Çoklu kullanımlarda aralarına virgul koyarak kullanabiliriz.
Paylaşılan bir class önbelleğinde class veri paylaşımını etkinleştirmek için aşağıda verilen parametre kullanılabilir.
-Xshareclasses
Bu paramere kullanıldığında JVM mevcut bir önbelleğe bağlanır. Eğer önbellek yok ise bir önbellek oluşturur. Aşağıda verilen örnekte “name” olarak verilen isimli önbelleğe bağlanacaktır.
Örnek:
-Xshareclasses:name
Birden fazla önbelleğe sahip olabiliriz. Bu durumda “-Xshareclasses”’i alt seçenek olarak ekleyerek doğru önbellek belirtimi yapmalıyız. Bu parametre ile ilgili aşağıda verilen kullanımları incelemek faydalı olacaktır.
Aşağıda verilen örnekte önbellek için bir dizin belirleniyor:
-Xshareclasses:cacheDir
Aşağıda verilen örnekte tüm önbellekler siliniyor:
-Xshareclasses:destroy
Önbellek istatistiklerini görmek için:
-Xshareclasses:printStats
Paylaşımda olan önbellekleri listelemek için:
-Xshareclasses:listAllCaches
Print Garbage Collection(GC)
Memory management üzerinde ince ayar çalışmalar yapıyorsak bu parametreler önemli derecede gereklidir.
Burada verilen parametrelerle GC loglama işlemleri etkinleştirilebilir.Böylece en kısa gecikmeleri,büyük ve küçük çöp toplama anlarını,ne tür çöp toplayıcı uygulandığını,ne sıklıkla tekrarlandığını ve ne kadar süre beklediğini de detaylıca inceleyebilir ve değerlendirebiliz.
-verbose:gc //GC çalıştırma ve ne kadar sürdüğünü kaydeder.
-XX:+PrintGCDetails //”-verbose:gc”’den gelen verileri içerir. Ancak aynı zamanda boyut ve daha doğru zamanlamalar hakkında bilgi ekler.
-XX:-PrintGCTimeStamps //Çöp toplama işleminde zaman damgalarını yazdırır.
OutOfMemory Error
İsminden de anlaşılacağı gibi yetersiz bellek durumunda tetiklenen bir hatadır. JVM bu gibi durumda bir yığın dökümü üretir. Bu yığın dökümünü almak için aşağıdaki parametre kullanılabilir.
XX:+HeapDumpOnOutOfMemoryError
Yetersiz bellek durumu çok detaylı bir sebepler zinciri sonucu oluşmuş olabilir. Tüm bu detayları görmek ve değerlendirmek için bu parametre hayati derecede önemlidir. Yığın dökümü default olarak JVM dizini içinde yer alır. Ancak belirli bir dizini bu iş için tahsis etmek istiyorsanız aşağıdaki parametreleri kullanabilirsiniz.
Bu kullanımda dikkat etmemiz gereken önemli bir nokta var. Yığın döküm içerik boyutu GB büyüklükte olabilir.Bu nedenle dizin olarak belirttiğiniz yolda yeterli kapasite izni olduğundan emin olun.
-XX:HeapDumpPath=/home/linaro/phrof-dumps
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
Ayrıca yetersiz bellek hatası oluştuktan sonra sunucuyu resetlemek istiyorsak aşağıdaki parametreyi kullanabiliriz:
XX:OnOutOfMemoryError="shutdown -r"
Yetersiz bellek durumu oluştuğunda,yığın(heap)’ın o anki durumunu belirten bir rapor üretilir.Bu raporu elde etmek için aşağıdaki parametre kullanılır:
-XX:+|-HeapDiagnosticsOnOutOfMemoryError
Class(Sınıf) İzleme
JVM serisinde ClassLoader sürecini detaylandırmıştık. Aşağıda verilen parametrelerle,”ClassLoading” ve “ClassUnloading” işlemi sırasında detaylı log elde etmek için kullanabiliriz.
İşlemler sırasında bellek zısıntısdan süpheleniyorsak veya yine buna bağlı olarak çöp toplamanın yapılmadığından süpheleniyorsak bu parametreler kullanışlıdır.
-XX:+TraceClassLoading
-XX:+TraceClassUnloading
KAYNAKLAR:
https://docs.oracle.com/javase/specs/jvms
https://docs.oracle.com
-end of