Java Virtual Machine(JVM) Parameters 2
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.
Java Virtual Machine(JVM) Parameters 1 makalesine buradan erişebilirsiniz.
Java Virtual Machine(JVM) bünyesinde çok sayıda JVM parametresi mevcuttur. Tümünü incelemek için elbette geniş kapsamlı içerikler üretmek gerekir. Ve bir noktadan sonra çok uç noktalarda hassas ayarlamalar yapmak için ayrılmış parametreler yer alır. Daha açık bir ifadeyle “JVM hacısı” olmak isteyenlerin yöneleceği parametrelerdir diyebilirim. Bütün bunları incelemek yerine,daha günlük ve sık kullanılan parametrelere yöneleceğiz.
Örneğin “Performans” ile ilgili parametreleri başucu kaynak olarak bilmemiz gerektiğini düşünüyorum.Dolayısıyla bu makale serisinde,
Java Virtual Machine’i yapılandırmak için kullanılabilecek en bilinen ve sık kullanılan parametreleri işliyoruz.
Memory Model
Xms ve Xmx kavramlarına bir önceki yazımda incelemiştik,ancak bunlara ek bazı detaylara burada yer vereceğim.
NOT: Kapsamlı olarak “Java Memory Model” kavramını sonraki yazılarımda inceleyeceğiz.
JVM kendi bellek modelini kullanır.Dolayısıyla JVM başlatılır başlatılmaz,bellek ayırma işlemi gerçekleşir ve bu bellek “Heap Memory,Stack Memory” tarafından paylaşılır. Dolayısıyla bu sözünü ettiğimiz başlangıç belleğini Xms ve Xmx ile belirtebileceğimizi önceki yazıda görmüştük. Şayet herhangi bir bellek belirtimi yapmaz isek,JVM default olarak bu değerleri belirler. Aşağıdaki örnekte JVM’nin başlatılacağı minimum ve maksimum bellek boyutu ayarlanıyor.
-Xms2G -Xmx5G
Bu örnekte 2GB minimum,5GB maksimum bellek boyutu belirlenmiştir. Ayrıca bellek belirtirken belirteç(KB,MB,GB) bayraklarını kullanabiliriz. Dolayısıyla Kilobyte için KB,Megabyte için MB ve Gigabyte için “G” kullanılır.
Metaspace
Bellek alanlarından ve performanstan bahsederken Java 8 ile birlikte gelen “Metaspace” kavramını gözardı edemeyiz.
Metaspace Java 8'den itibaren gelen,daha esnek ve güvenilir bir bellek kullanımı sağlamak için daha eski olan PermGen yerine geliştirilmiştir.
Metaspace’de bellek süreçleri C’de olduğu gibidir.Bana göre bu etkili bir özelliktir. Ve bir diğer husus ise,Metaspace alanı tarafından kullanılabilecek native bellek miktarı default olarak sınırsızdır.
Ancak “MaxMetaspaceSize” ile metaspace için maksimum üst sınır belirleyebiliriz.
Bellek tüketimi maksimum sınıra yaklaştığında,diğer süreçlerde olduğu gibi Metaspace için de GC devreye girecektir.MetaSpace ile ilgili parametrelere aşağıda yer verilmiştir.
Başlangıç için bellek miktarı belirlemek:
-XX:MetaspaceSize
Bellek alanı için üst sınır belirlemek:
-XX:MaxMetaspaceSize
Sınıf meta veri kapasitesinin minimum yüzdesini belirlemek:
-XX:MinMetaspaceFreeRatio
Sınıf meta veri kapasitesinin maksimum yüzdesini belirlemek:
-XX:MaxMetaspaceFreeRatio
Java 8 öncesinde,yani PermGen için örnek kullanım:
Başlangıç için bellek miktarı belirleme:
-XX:PermSize=100M
Bellek alanı için üst sınır belirleme:
-XX:MaxPermSize=500M
NOT:”PermGen” hakkında kısa bir inceleme “OpenJDK Build” yazılarım serisinde yapmıştık. Metaspace Java8 itibariyle gelen bir kavramdır. Eğer önceki sürümlerle çalışıyorsanız Metaspace kavramı yerine PermGen varlığını sürdürecektir.Dolayısıyla OpenJDK build ederken “java seri-sürüm” numaralarına göre seçim yapmanız gerekir. PermGen ile ilgili soru ve istekler gelirse detaylı bir çalışma yapacağım.
Java Class Metadata
Metadata’yı detaylandırmak için oldukça kapsamlı bir içerik hazırlamak gerekir.
Ancak bu makalede bu kadar derinlemesine inmeyeceğiz. Sadece ne olduğu ve görevine değinmeye çalışacağız.
Class Metadata: Java kodunu dinamik olarak yüklemek(load),bağlamak(link),derlemek(compile) ve yürütmek(execute) için Java’nın çalışma zamanında(runtime) tuttuğu sınıf(class) tabanının modelidir.Bu modeli oluşturmak ve tutmak,bu saydığımız süreçler için oldukça verimli bir sonuç oluşturur.
Örneğin derleme sürecinde class ile ilgili yapıyı derleyiciye bildirmesi derleme süreci için oldukça faydalıdır. Aynı durum “Yorumlayıcı(Interpreter)” ve dolayısıyla çalışma zamanı(runtime) için de geçerlidir.
Garbage Collection Ve Performans Seçenekleri
Çöp toplayıcısını(G1) kullanmak:
-XX:+UseG1GC
Çöp toplayıcısının maksimum duraklama süresini belirlemek.Ancak bu pek stabil bir süre olmayabilir. Fakat JVM bu süreye bağlı kalmaya çalışacaktır.
-XX:MaxGCPauseMillis=n
Eşzamanlı bir çöp toplama döngüsünü başlatmak için yığın doluluk oranı yüzdesi belirlenebilir. Eğer bu parametreye “0” verirseniz,bu sabit döngüyü devreye alır.Bu parametrenin default değeri 45'tir.
-XX:InitiatingHeapOccupancyPercent=n
Görev süresi eşiği için maksimum değer belirlemek.Default değer 15'tir.
-XX:MaxTenuringThreshold=n
Çöp toplayıcıların paralel aşamaları sırasında çalışacak thread sayısını belirler.
Bu parametrenin default değeri,JVM’nin çalıştığı platforma göre değişebilir.
Dolayısıyla kesin bir default değeri söylemek mümkün değildir.
-XX:ParallelGCThreads=n
Eşzamanlı çöp toplayıcıların kullanacağı thread sayısı.
Bu parametrenin default değeri,JVM’nin çalıştığı platforma göre değişebilir.
-XX:ConcGCThreads=n
Alan taşması riskini azaltmak için boş kalacak yedek bellek yüzdesini ayarlar.
Default değer 10'dur. Bu değeri arttırırken veya azaltırken,toplam java yığınını aynı miktarda ayarladığınızdan emin olun.
-XX:G1HeapRegionSize=n
Performans derleyici optimizasyonlarını açmak.
-XX:+AggressiveOpts
Derlemeden önce method çağırma sayısını belirler.
-XX:CompileThreshold=10000
Java heap için kullanılan büyük sayfa boyutunu ayarlar.
-XX:LargePageSizeInBytes=4M
GC’den sonra minimum heap yüzdesini belirler.
-XX:MinHeapFreeRatio=40
GC’den sonra maksimum heap yüzdesini belirler.
-XX:MaxHeapFreeRatio=70
Maksimum kod önbellek boyutu.
-XX:ReservedCodeCacheSize=32m
Thread yığın boyutu.
-XX:ThreadStackSize=512
Paylaşılan hafızayı kullanmak.
-XX:-UseISM
Büyük bellek sayfaları kullanmak.
-XX:+UseLargePages
Çoklu sayfa boyutu desteğini kullan.
-XX:+UseMPSS
Yaygın olarak tahsis edilen dizelerin önbelleğe alınmasını sağlar.
-XX:+UseStringCache
Saf ASCII dizeler için byte[] kullanmak.
-XX:+UseCompressedStrings
Mümkün olduğunda dize birleştirme işlemlerini optimize edin.
-XX:+OptimizeStringConcat
Çöp toplama esnasında mesajları yazdır.
-XX:-PrintGC
Bir method derlendiğinde mesaj yazdır.
-XX:-PrintCompilation
Komut satırında görüntülenen bayrakları yazdır.
-XX:-PrintCommandLineFlags
JIT derleyicisinde harcanan zamanı yazdır.
-XX:-CITime
Oluşan hataları bir dosyaya yazdır.
-XX:ErrorFile=./hs_err_pid<pid>.log
KAYNAKLAR:
https://oracle.com/java/technologies
https://docs.oracle.com/javase/specs/jvms
https://docs.oracle.com
https://openjdk.java.net/
-end of