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.
İpucu
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.
İpucu
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.
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 iş parçacıklı | Hayır | Evet | Evet | Evet | Yes |
Java yığın boyutu | <4 GByte | <4 GByte | >4 GByte | >4 GByte | >4 GByte |
Duraklat | Yes | Evet | Yes | 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) |
İpucu
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 herhangi bir GC için iki veya daha fazla vCPU çekirdeği (veya Kubernetes'te en az 2000m
cpu_limit ) öneririz. Kapsayıcılı ortamlarda 1'den az vCPU çekirdeği seçmenizi önermeyiz.
İpucu
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: