Java uygulamalarınızı kapsayıcıya alma

Bu makalede, Java uygulamalarını kapsayıcıya alma için önerilen stratejilere ve ayarlara genel bir bakış sağlanır.

Bir Java uygulamasını kapsayıcıya alırken kapsayıcının ne kadar CPU süresine sahip olacağını dikkatle göz önünde bulundurun. Ardından hem toplam bellek miktarı hem de Java Sanal Makinesi'nin (JVM) yığın boyutu açısından ne kadar belleğin kullanılabilir olacağını göz önünde bulundurun. Kapsayıcılı ortamlarda uygulamalar tüm işlemcilere erişebilir ve bu nedenle birden çok iş parçacığını paralel olarak çalıştırabilir. Ancak kapsayıcıların CPU'lara erişimi kısıtlayan bir CPU kotası uygulanması yaygın bir durumdur.

JVM,CPU kotasına göre "kullanılabilir işlemcilerin" sayısını belirlemek için buluşsal yöntemlere sahiptir ve bu da Java uygulamalarının performansını önemli ölçüde etkileyebilir. Kapsayıcının kendisine ayrılan bellek ve JVM için yığın alanının boyutu işlemciler kadar önemlidir. Bu faktörler, çöp toplayıcının (GC) davranışını ve sistemin genel performansını belirler.

Yeni bir uygulamayı kapsayıcıya alma

Yeni bir uygulama için Java iş yükünü kapsayıcıya alırken, bellek hakkında düşünürken iki şeyi dikkate almanız gerekir:

  • Kapsayıcının kendisine ayrılan bellek.
  • Java işlemi için kullanılabilir bellek miktarı.

JVM varsayılan ergonomiyi anlama

Uygulamaların bir başlangıç noktası ve ayarları olması gerekir. JVM, sistemdeki kullanılabilir işlemci sayısına ve bellek miktarına göre önceden tanımlanmış değerlerle varsayılan ergonomiye sahiptir. Aşağıdaki tablolarda gösterilen varsayılan değerler, JVM belirli başlangıç bayrakları veya parametreleri olmadan başlatıldığında kullanılır.

Aşağıdaki tabloda, kullanılabilir kaynaklar için kullanılan varsayılan GC gösterilmektedir:

Kullanılabilir kaynaklar Varsayılan GC
herhangi bir sayıda işlemci
En fazla 1791 MB bellek
SerialGC
2' den fazla işlemci
1792 MB veya daha fazla bellek
G1GC

Aşağıdaki tabloda, JVM'nin çalıştığı ortamda ne kadar bellek bulunduğuna bağlı olarak varsayılan en yüksek yığın boyutu gösterilmektedir:

Kullanılabilir bellek Varsayılan en büyük yığın boyutu
256 MB'a kadar Kullanılabilir belleğin %50'sini
256 MB - 512 MB Yaklaşık 127 MB
512 MB'tan fazla Kullanılabilir belleğin %25'i

Varsayılan ilk yığın boyutu kullanılabilir belleğin 1/64'dür.

Bu değerler OpenJDK 11 ve üzeri için ve Microsoft Build of OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK ve diğerleri gibi çoğu dağıtım için geçerlidir.

Kapsayıcı belleğini belirleme

Uygulamanızın gereksinimlerine ve ayırt edici kullanım desenlerine bağlı olarak iş yükünüz için en uygun kapsayıcı bellek miktarını seçin. Örneğin, uygulamanız büyük nesne grafikleri oluşturuyorsa, büyük olasılıkla çok sayıda küçük nesne grafı olan uygulamalar için gerekenden daha fazla belleğe ihtiyacınız olacaktır.

Bahşiş

Ne kadar bellek ayırabileceğinizi bilmiyorsanız, iyi bir başlangıç noktası 4 GB'tır.

JVM yığın belleğini belirleme

JVM yığın belleğini ayırdığınızda, JVM'nin yalnızca JVM yığını için kullanılandan daha fazla belleğe ihtiyacı olduğunu unutmayın. En yüksek JVM yığın belleğini ayarladığınızda, kapsayıcı belleği miktarına eşit olmamalıdır çünkü bu durum kapsayıcı Yetersiz Bellek (OOM) hatalarına ve kapsayıcı kilitlenmelerine neden olur.

Bahşiş

JVM yığını için kapsayıcı belleğinin %75'ini ayırın.

OpenJDK 11 ve sonraki sürümlerde JVM yığın boyutunu aşağıdaki yollarla ayarlayabilirsiniz:

Açıklama Bayrak Örnekler
Sabit değer -Xmx -Xmx4g
Dinamik değer -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

En küçük/ilk yığın boyutu

Ortamın bir JVM örneğine ayrılmış belirli miktarda belleğe (örneğin kapsayıcıda) sahip olması garanti edilirse, en düşük yığın boyutunu (veya ilk yığın boyutunu) en büyük yığın boyutuyla aynı boyuta ayarlamanız gerekir. Bu ayar, JVM'ye işletim sistemine bellek boşaltma görevini gerçekleştirmemesi gerektiğini gösterir.

En düşük yığın boyutunu ayarlamak için mutlak tutarlar veya -XX:InitialRAMPercentage yüzde miktarları için kullanın-Xms.

Önemli

bayrağı -XX:MinRAMPercentage, adından da anlaşılacağı gibi, sistemde 256 MB'a kadar RAM'e sahip sistemler için varsayılan maksimum RAM yüzdesini ayarlamak için kullanılır.

Chart showing the default heap size on OpenJDK 17.

Hangi GC'nin kullanılacağını belirleme

Daha önce, başlangıç olarak JVM yığın belleği miktarını belirlediniz. Sonraki adım GC'nizi seçmektir. Sahip olduğunuz maksimum JVM yığın belleği miktarı genellikle GC'nizi seçmede bir faktördür. Aşağıdaki tabloda her GC'nin özellikleri açıklanmaktadır.

Faktörler SerialGC ParallelGC G1GC ZGC ShenandoahGC
Çekirdek sayısı 1 2 2 2 2
Çok kanallı Hayır Evet Evet Evet Evet
Java yığın boyutu <4 GByte <4 GByte >4 GByte >4 GByte >4 GByte
Duraklat Evet Evet Evet Evet (<1 ms) Evet (<10 ms)
Genel Masraf Minimal Minimal Orta Orta Orta
Kuyruk gecikme süresi Etkisi Yüksek Yüksek Yüksek Düşük Orta
JDK sürümü Tümü Tümü JDK 8+ JDK 17+ JDK 11+
En iyi kullanım alanı: Tek çekirdekli küçük yığınlar Herhangi bir yığın boyutuna sahip çok çekirdekli küçük yığınlar veya toplu iş yükleri Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri) Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri) Orta ve büyük yığınlarda yanıt verme (istek-yanıt/VERITABANı etkileşimleri)

Bahşiş

Genel amaçlı mikro hizmet uygulamalarının çoğu için Paralel GC ile başlayın.

Kaç CPU çekirdeği gerektiğini belirleme

SerialGC dışındaki tüm GC'ler için iki veya daha fazla vCPU çekirdeği (veya Kubernetes'te en az 2000mcpu_limit ) öneririz. Kapsayıcılı ortamlarda 1'den az vCPU çekirdeği seçmenizi önermeyiz.

Bahşiş

Kaç çekirdekle başlayacağınızı bilmiyorsanız 2 vCPU çekirdeği iyi bir seçimdir.

Başlangıç noktası seçin

Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps ve Azure Uygulaması Service gibi kapsayıcı düzenleme ortamlarında iki çoğaltma veya örnekle başlamanızı öneririz. Aşağıdaki tabloda, yeni Java uygulamanızın kapsayıcılı hale getirilmesi için önerilen başlangıç noktaları özetlenmiştir.

vCPU çekirdekleri Kapsayıcı belleği JVM yığın boyutu GC Çoğaltmalar
2 4 GB %75 ParallelGC 2

Kullanılacak JVM parametreleri şunlardır: -XX:+UseParallelGC -XX:MaxRAMPercentage=75

Mevcut (şirket içi) bir uygulamayı kapsayıcıya alma

Uygulamanız zaten şirket içinde veya buluttaki bir VM'de çalışıyorsa, şununla başlamanızı öneririz:

  • Uygulamanın şu anda erişimi olan bellek miktarı.
  • Uygulamanın şu anda kullanılabilir durumdaki CPU sayısı (vCPU çekirdeği).
  • Şu anda kullandığınız JVM parametreleri.

vCPU çekirdekleri ve/veya kapsayıcı bellek bileşimi kullanılamıyorsa, vCPU çekirdeklerini ve kapsayıcı belleğini yuvarlayarak en yakın olanı seçin.

Sonraki adımlar

Java uygulamalarını kapsayıcıya almaya yönelik genel önerileri anladığınıza göre kapsayıcı temeli oluşturmak için aşağıdaki makaleye geçin: