Java Virtual Machine(JVM) Parameters 2

Kerim Fırat
4 min readJun 14, 2021

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

--

--

Kerim Fırat
Kerim Fırat

Written by Kerim Fırat

Senior Android Platform(AOSP,AAOS) Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author

No responses yet