JVM Parametreleri

Zafer Durkut
5 min readNov 15, 2020

--

Merhaba,

Bu çalışma ile birlikte JVM kullanımı için kullanılan parametrelerin kendi yaptığım çalışmalar doğrutusunda açıklanması konusunda küçük bir story bırakmak istedim.

1. Explicit Heap Memory

Kullanılacak olan ram hafızasının ayarlanması için kullanılır. Parametreler aşağıdaki gibidir;

  • -Xms: JVM başlatıldığında ilk yığın boyutunu ayarlar.
  • -Xmx: Maksimum yığın boyutunu ayarlar.
  • -Xmn: Genç Neslin boyutunu ayarlar.
  • -XX: PermSize: Daimi Neslin başlangıç ​​büyüklüğünü ayarlar.
  • -XX: MaxPermSize: Kalıcı Neslin maksimum boyutunu ayarlar.

Örneğin, JVM’ye en az 2 GB ve en fazla 5 GB atamak istersek şunu yazmamız gerekir.

-Xms2g –Xmx5g

Genç Nesil: Tüm yeni nesneleri tahsis ve yaşlı yerdir. Genç nesil dolduğunda, bu küçük bir çöp toplama neden olur. Ölü nesnelerle dolu genç bir nesil çok hızlı toplanır. Yaşayan bazı nesiller yaşlanmış ve sonunda eski kuşağa geçiyor.

Eden Uzayı: Bu alana ayrılmış yeni anahtar kelime belleği kullanılarak nesne oluşturulduğunda.

Survivor: Bu, Eden alanından java çöp toplama işleminden sonra hayatta kalmış nesneleri içeren havuzdur.

Eski Nesil: Eski Nesil uzun hayatta kalan nesneleri depolamak için kullanılır. Tipik olarak, genç nesil nesne için bir eşik belirlenir ve yaşına geldiğinde nesne eski kuşağa taşınır. Sonunda eski neslin toplanması gerekiyor. Bu olaya büyük bir çöp toplama adı verilir.

Tenured Space: Bu hafıza havuzu, birden fazla çöp toplama sonrasında hayatta kalan nesneleri, Survivor alanından çöp toplama sonrasında hayatta kalan nesne içerir.

Kalıcı Nesil: Adı olarak bu bellek havuzu, kalıcı sınıf meta verileri ve tanımlayıcı bilgileri içerdiğini söylüyor; bu nedenle PermGen alanı her zaman sınıflar için ve bu statik üyeler gibi sınıflara bağlı olanlar için ayrılmıştır.

2. Metaspace

Ölü sınıfların ve sınıf yükleyicilerinin çöp toplama işlemi, sınıf meta verileri kullanımına ulaştığında tetiklenir. Temizlenecek verileri metadatalarını tutar. Metaspace, memory belirlenen sınıra ulaştığında JVM otomatik olarak memory arttırır. Metaspace ile Javanın bu kararsız otomatik yapısından kurtulması amaçlanmıştır.

  • -XX: MetaspaceSize= : Meta veriler için ayrılan başlangıç miktarıdır.
  • -XX: MaxMetaspaceSize = : Meta veriler için ayrılan maksimum miktardır.
  • -XX: MinMetaspaceFreeRatio = :Meta veriler minimum için boş bırakılacak orandır.
  • -XX: MaxMetaspaceFreeRatio = : Meta veriler maksimum için boş bırakılacak orandır.

3. Garbage Collection

Uygulamanın daha iyi istikrarı sağlamak için doğru Çöp Toplama algoritmasının seçilmesi kritik önem taşır.

JVM’nin dört çeşit GC uygulaması vardır:

Seri Çöp toplayıcı: -XX:+UseSerialGC

Paralel Çöp toplayıcı: -XX:+UseParallelGC

CMS Çöp toplayıcısı: -XX:+UseSerialGC

G1 Çöp toplayıcısı: -XX:+UseG1GC

Seri Çöp toplayıcı:

Seri GC, düşük duraklama süresi gereksinimleri olmayan ve istemci tarzı makinelerde çalıştırılan çoğu uygulama için çöp toplayıcıdır. Çöp toplama çalışması için yalnızca tek bir sanal işlemciden yararlanır (bu nedenle, adı). Yine de, günümüzün donanımında Serial GC, birkaç yüz MB’lık Java öbeği ile önemsiz olmayan pek çok uygulamayı verimli şekilde yönetebilir ve göreceli olarak kısa zaman aralıklarıyla (tam çöp toplama işlemleri için birkaç saniye kaldı) başarıyla gerçekleştirebilir. GC uygulaması, çalıştırıldığında tüm uygulama parçacıklarını dondurur. Bu nedenle, sunucu ortamları gibi çok iş parçacıklı uygulamalarda kullanmak iyi bir fikir değildir.

Paralel Çöp toplayıcı:

Paralel çöp toplayıcı, genç genertion çöp toplama işlemini gerçekleştirmek için birden fazla iş parçacığı kullanır. Varsayılan olarak, n CPU’lu bir ana bilgisayarda, paralel çöp toplayıcı toplama n atık toplayıcı iş parçacığı kullanır. Çöp toplayıcı iş parçacığı sayısı, komut satırı seçenekleri ile kontrol edilebilir.

  • -XX:+UseParallelGC : Bu komut satırı seçeneğiyle tek dişli eski nesil toplayıcı ile çok parçacıklı genç nesil koleksiyoncusu elde edersiniz. Seçenek, aynı zamanda eski neslin tek iş parçacıklı sıkıştırmasını da yapıyor.
  • -XX:+UseParallelOldGC : Bu -XX:+UseParallelOldGC opsiyonla, GC hem çok iş parçacıklı bir genç nesil kollektör hem de çok iş parçacıklı eski nesil kollektör. Aynı zamanda çok iş parçacıklı sıkıştırmalı bir kollektör. HotSpot yalnızca eski nesilde sıkıştırma yapar. HotSpot’taki genç nesil bir kopya toplayıcı olarak düşünülür; Bu nedenle sıkıştırmaya gerek yoktur.

CMS Çöp toplayıcısı:

Eşzamanlı Mark Sweep (CMS) toplayıcı (aynı anda düşük bekar toplayıcı olarak da bilinir) emekli nesil toplar. Çöp toplama işleminin çoğunu uygulama parçacıklarıyla eşzamanlı olarak yaparak çöp toplama nedeniyle duraklamaları en aza indirmeye çalışır. Normalde eş zamanlı düşük bekleme toplayıcı canlı nesneleri kopyalamaz veya sıkıştırmaz. Canlı nesneleri taşımadan bir çöp toplama işlemi yapılır.

  • -XX:+UseConcMarkSweepGC : CMS Kollektörünü etkinleştirmek kullanılır.
  • -XX:ParallelCMSThreads=<n> : Cms için kullanılacak parçacık sayısını etkinleştirir.

G1 Çöp toplayıcısı:

Garbage First veya G1 çöp toplayıcı Java 7'de mevcuttur ve CMS toplayıcısının uzun vadeli değiştirilmesi için tasarlanmıştır. G1 toplayıcı, daha önce açıklanan diğer çöp toplayıcılarından farklı bir düzene sahip, paralel, eş zamanlı ve aşamalı olarak sıkıştıran düşük duraklı çöp toplayıcıdır. Bununla birlikte, ayrıntılı tartışma bu OBE’nin kapsamı dışındadır.

  • -XX:+UseG1GC : G1 Collector’ı etkinleştirmek kullanılır.

4. GC Logging

GC günlüğünü kayıt etmek için kullanılır.

  • -XX:+UseGCLogFileRotation : Gibi günlük dosyası kaydırma ilkesini belirtir.
  • -XX:NumberOfGCLogFiles=10 : Tek bir uygulama yaşam döngüsü için yazılabilen günlük dosyalarının maksimum sayısını belirtir.
  • -XX:GCLogFileSize=10M : Dosyanın maksimum boyutunu belirtir.
  • -Xloggc:/path/to/gc.log : Konumu belirtir.

5. Handling Out of Memory

  • XX:+HeapDumpOnOutOfMemoryError : OutOfMemoryError durumunda fiziksel dosyaya yığın dökümü talimatı verir
  • XX:HeapDumpPath=./java_pid<pid>.hprof : dosyanın yazıldığı yolu belirtir; herhangi bir dosya adı verilebilir; Bununla birlikte, JVM adında bir <pid> etiketi bulursa, bellek yetersizliğine neden olan geçerli işlemin işlem kimliği, .hprof biçimindeki dosya adına eklenir.
  • XX:OnOutOfMemoryError=”< cmd args >;< cmd args >” : ellek yetersizliği hatası durumunda çalıştırılacak acil komutlar vermek için kullanılır; cmd args uzayında doğru komut kullanılmalıdır. Örneğin, sunucuyu, bellek yetersizliği oluştuğu anda yeniden başlatmak istersek, parametreyi ayarlayabiliriz.
  • -XX:OnOutOfMemoryError=”shutdown -r”
  • -XX:+UseGCOverheadLimit : bir OutOfMemory hatası atılmadan önce GC’de harcanan VM zamanının oranını sınırlayan bir ilkedir.

6. Misc

-server : “Sunucu Hotspot VM’sini etkinleştirir; bu parametre 64 bit JVM’de varsayılan olarak kullanılır

  • -XX: + UseStringDeduplication : Java 8u20 bu JVM parametresini, aynı String’in çok sayıda örneğini oluşturarak gereksiz bellek kullanımını azaltmak için başlattı ; yinelenen String değerlerini tek bir genel char [] dizisine indirgeyerek öbek belleğini en iyi duruma getirir
  • -XX: + UseLWPSynchronization : Işık tabanlı senkronizasyon yerine LWP ( Hafif İşlem ) tabanlı senkronizasyon ilkesini ayarlar .
  • -XX: LargePageSizeInBytes : Java öbek için kullanılan büyük sayfa boyutunu ayarlar; argüman GB / MB / KB cinsinden alınır; Daha büyük sayfa boyutlarıyla sanal bellek donanım kaynaklarını daha iyi kullanabiliriz; Bununla birlikte, bu, PermGen için daha büyük alan boyutlarına neden olabilir; bu da, Java yığın alanının boyutunu azaltmak için zorlayabilir
  • -XX: MaxHeapFreeRatio : sonra serbest yığın maksimum yüzdesini ayarlar GC küçülen önlemek için.
  • -XX: MinHeapFreeRatio : sonra serbest yığın minimum yüzde ayarlar GC genişlemesini önlemek için; yığın kullanımını izlemek için JDK ile birlikte gelen VisualVM kullanabilirsiniz.
  • -XX: SurvivorRatio : Eden / hayatta kalma alanı boyutunun oranı- örneğin -XX: SurvivorRatio = 6 , her kurtulan alanı ve eden alanı arasındaki oranı1: 6 olarak ayarlar,
  • -XX: + UseLargePages : sistem tarafından destekleniyorsa büyük sayfa belleği kullanın; lütfenbu JVM parametresini kullanırsanız OpenJDK 7'nin çökme eğiliminde olduğunu unutmayın
  • -XX: + UseStringCache : Dize havuzunda bulunan yaygın olarak ayrılmış dizelerin önbelleğe alınmasını sağlar
  • -XX: + UseCompressedStrings : Saf ASCII formatında temsil edilebilen String nesneleri için bir byte [] tipikullanın
  • -XX: + OptimizeStringConcat : Mümkün olduğunca dizge birleştirme işlemlerini optimize eder.

Yukarıdaki bilgiler doğrultusunda jvmmemory adresi üzerinden kendi çalışmanıza uygun olarak JVM parametrelerini oluşturabilirsiniz.

İyi Çalışmalar

Kaynakça

1. http://www.baeldung.com/jvm-parameters

2. http://jvmmemory.com/

3.http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

4. https://stackoverflow.com/questions/2129044/java-heap-terminology-young-old-and-permanent-generations

5. http://www.baeldung.com/jvm-garbage-collectors

--

--