Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek obsahuje přehled doporučených strategií a nastavení pro kontejnerizaci aplikací v Javě. Při kontejnerizaci Java aplikace pečlivě zvažte, kolik času procesoru má kontejner k dispozici. Pak zvažte, kolik paměti je k dispozici jak z hlediska celkového množství paměti, tak velikosti haldy virtuálního počítače Java (JVM). V kontejnerizovaných prostředích můžou mít aplikace přístup ke všem procesorům, a proto mohou paralelně spouštět více vláken. Je ale běžné, že kontejnery mají použitou kvótu procesoru, která může omezovat přístup k procesorům.
JVM používá heuristika k určení počtu "dostupných procesorů" na základě kvóty procesoru, což může výrazně ovlivnit výkon Java aplikací. Paměť přidělená samotnému kontejneru a velikost oblasti haldy pro JVM jsou stejně důležitá jako procesory. Tyto faktory určují chování uvolňování paměti (GC) a celkový výkon systému.
Návod
Pokud tato nastavení nechcete ladit ručně, Azure spouštěč příkazů pro Java (jaz) automaticky použije výchozí nastavení JVM nativní pro cloud. Jde o přímou náhradu příkazu java, která rozpozná limity kontejneru a zvolí optimální velikost haldy a příznaky GC. Další informace najdete v tématu Automatické ladění prostředí JVM pomocí spouštěče příkazů Azure pro Java.
Kontejnerizace nové aplikace
Při kontejnerizaci úlohy Java pro novou aplikaci zvažte dvě věci při zvažování paměti:
- Paměť přidělená samotnému kontejneru.
- Množství paměti dostupné pro proces Javy.
Pochopte výchozí ergonomii JVM
Aplikace potřebují výchozí bod a nastavení. Prostředí JVM má výchozí ergonomii s předdefinovanými hodnotami založenými na počtu dostupných procesorů a množství paměti v systému. Prostředí JVM používá při spuštění výchozí hodnoty uvedené v následujících tabulkách bez konkrétních příznaků spuštění nebo parametrů.
Následující tabulka uvádí výchozí GC pro dostupné prostředky:
| Dostupné prostředky | Výchozí GC |
|---|---|
| Libovolný počet procesorů Až 1 791 MB paměti |
SerialGC |
| Více než 2 procesory 1 792 MB nebo více paměti |
G1GC |
Následující tabulka ukazuje výchozí maximální velikost haldy v závislosti na tom, kolik paměti je dostupné v prostředí, ve kterém je prostředí JVM spuštěné:
| Dostupná paměť | Výchozí maximální velikost haldy |
|---|---|
| Až 256 MB | 50% dostupné paměti |
| 256 MB až 512 MB | ~127 MB |
| Více než 512 MB | 25% dostupné paměti |
Výchozí počáteční velikost haldy je 1/64 dostupné paměti. Tyto hodnoty jsou platné pro OpenJDK 11 a novější – a pro většinu distribucí, včetně sady Microsoft Build pro OpenJDK, Azul Zulu, Eclipse Temurin, Oracle OpenJDK a dalších.
Určení paměti kontejneru
Vyberte velikost paměti kontejneru, která nejlépe vyhovuje vašim úlohám v závislosti na potřebách vaší aplikace a jejích výrazných vzorech použití. Pokud například vaše aplikace vytváří velké grafy objektů, pravděpodobně potřebujete více paměti, než byste potřebovali pro aplikace s mnoha malými grafy objektů.
Návod
Pokud nevíte, kolik paměti se má přidělit, je dobrým výchozím bodem 4 GB.
Zjištění haldy paměti JVM
Když přidělujete paměť pro haldu JVM, mějte na paměti, že JVM potřebuje více paměti, než kolik přidělíte pro haldu JVM. Nenastavujte maximální paměť haldy JVM tak, aby byla rovna množství paměti kontejneru. Toto nastavení může způsobit chyby kontejneru typu Out of Memory (OOM) a selhání kontejneru.
Návod
Přidělte 75% paměti kontejneru pro hromadu JVM.
V openJDK 11 a novějším nastavte velikost haldy JVM jedním z následujících způsobů:
| Popis | Vlajka | Příklady |
|---|---|---|
| Pevná hodnota | -Xmx |
-Xmx4g |
| Dynamická hodnota | -XX:MaxRAMPercentage |
-XX:MaxRAMPercentage=75 |
Minimální nebo počáteční velikost haldy
Pokud prostředí zaručuje určitou velikost paměti vyhrazenou pro instanci JVM, například v kontejneru, nastavte minimální velikost haldy nebo počáteční velikost haldy na stejnou velikost jako maximální velikost haldy. Toto nastavení označuje prostředí JVM, že by nemělo provádět úlohu uvolnění paměti do operačního systému.
Pokud chcete nastavit minimální velikost haldy, použijte -Xms absolutní částky nebo -XX:InitialRAMPercentage procentuální částky.
Důležité
Bez ohledu na název nastaví příznak -XX:MinRAMPercentage výchozí maximální procento paměti RAM pro systémy s až 256 MB paměti RAM, které jsou v systému dostupné.
Určení toho, který GC se má použít
Dříve jste určili množství paměti haldy JVM pro začátek. Dalším krokem je zvolit váš GC. Velikost maximální paměti haldy JVM, kterou máte k dispozici, často ovlivňuje vaši volbu GC. Následující tabulka popisuje charakteristiky jednotlivých GC.
| Faktory | SerialGC | ParallelGC | G1GC | ZGC | ShenandoahGC |
|---|---|---|---|---|---|
| Počet jader | 1 | 2 | 2 | 2 | 2 |
| Vícevláknový | Ne | Ano | Ano | Ano | Ano |
| Velikost haldy Java | <4 GB | <4 GB | >4 GB | >4 GB | >4 GB |
| Pauza | Ano | Ano | Ano | Ano (<1 ms) | Ano (<10 ms) |
| Režijní náklady | Minimální | Minimální | Mírný | Mírný | Mírný |
| Efekt koncové latence | Vysoko | Vysoko | Vysoko | Nízké | Mírný |
| Verze sady JDK | Všechno | Všechno | JDK 8 a novější | JDK 17 a novější | JDK 11 a novější |
| Nejvhodnější pro | Malé haldy s jedním jádrem | Malé vícejádrové haldy nebo dávkové úlohy s haldami libovolné velikosti | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) | Responzivní ve středních až velkých úlohách (interakce typu požadavek-odpověď/databáze) |
Návod
Pro většinu běžných aplikací mikroslužeb začněte s Parallel GC.
Určení počtu potřebných jader procesoru
Pro jakýkoli GC jiný než SerialGC použijte dvě nebo více jader vCPU – nebo alespoň 2000m pro cpu_limit v Kubernetes. Nevybírejte v kontejnerizovaných prostředích méně než jedno jádro vCPU.
Návod
Pokud nevíte, s kolika jádry začít, dobrou volbou jsou dvě jádra vCPU.
Výběr výchozího bodu
Začněte se dvěma replikami nebo instancemi v prostředích orchestrace kontejnerů, jako je Kubernetes, OpenShift, Azure Spring Apps, Azure Container Apps a Azure App Service. Následující tabulka shrnuje doporučené výchozí body pro kontejnerizaci nové aplikace v Javě.
| Jádra virtuálních CPU | Paměť kontejneru | Velikost haldy JVM | uvolňování paměti | Repliky |
|---|---|---|---|---|
| 2 | 4 GB | 75 % | ParallelGC | 2 |
Použijte následující parametry prostředí JVM:
-XX:+UseParallelGC -XX:MaxRAMPercentage=75
Automatické ladění prostředí JVM pomocí spouštěče příkazů Azure pro Java
Předchozí části popisují, jak zvolit příznaky JVM ručně na základě paměti kontejneru, jader procesoru a typu úlohy. Pokud nechcete tato nastavení udržovat sami, Azure spouštěč příkazů pro Java (jaz) automaticky použije výchozí hodnoty JVM nativní pro cloud.
Spouštěč příkazů Azure pro Java je jednoduchý nástroj, který se nachází mezi spouštěcím příkazem a prostředím JVM. Zjistí cloudové prostředí včetně limitů paměti kontejneru a CPU a následně vybere nejvhodnější parametry ladění pro nastavení velikosti haldy, volbu garbage collectoru a diagnostiku. Tento přístup snižuje režii spojenou s konfigurací a již v základním nastavení zlepšuje využití zdrojů.
Chcete-li nástroj použít, nahraďte příkaz java příkazem jaz ve spouštěcím skriptu nebo souboru Dockerfile. Například místo ručního ladění možností JVM:
java -XX:+UseParallelGC -XX:MaxRAMPercentage=75 -jar myapp.jar
jaz použijte:
jaz -jar myapp.jar
Nástroj je součástí image kontejneru pro Microsoft Build pro OpenJDK, takže není nutné žádné další nastavení. Následující soubor Dockerfile používá jaz ke spuštění Java aplikace ze jar souboru:
# Use any Microsoft Build of OpenJDK base image
FROM mcr.microsoft.com/openjdk/jdk:25-ubuntu
# Add your application.jar
COPY application.jar /application.jar
# Use jaz to launch your Java application
CMD ["jaz", "-jar", "application.jar"]
Podrobnosti o možnostech instalace, podporovaných prostředích a konfiguraci najdete v Azure spouštěči příkazů pro Java.
Kontejnerizace existující místní aplikace
Pokud už vaše aplikace běží místně nebo na virtuálním počítači v cloudu, začněte s následující konfigurací:
- Stejné množství paměti, ke které má aplikace aktuálně přístup.
- Stejný počet procesorů nebo jader vCPU, které má aplikace aktuálně k dispozici.
- Stejné parametry prostředí JVM, které aktuálně používáte.
Pokud není daná kombinace jader vCPU a paměti kontejneru k dispozici, vyberte nejbližší možnost se zaokrouhlením počtu jader vCPU a paměti kontejneru nahoru.
Další kroky
Teď, když rozumíte obecným doporučením pro kontejnerizaci Java aplikací, pokračujte následujícími články, abyste vytvořili standardní hodnoty kontejnerizace a zjednodušili ladění prostředí JVM: