Java-alkalmazások tárolóba helyezése

Ez a cikk áttekintést nyújt a Java-alkalmazások tárolóba helyezéséhez javasolt stratégiákról és beállításokról. Egy Java alkalmazás tárolóba helyezésekor gondosan gondolja át, hogy mennyi processzoridő áll rendelkezésre. Ezután fontolja meg, hogy mennyi memória áll rendelkezésre mind a teljes memóriamennyiség, mind a Java virtuális gép (JVM) halommérete szempontjából. Tárolóalapú környezetekben az alkalmazások hozzáférhetnek az összes processzorhoz, ezért több szálat is futtathatnak párhuzamosan. Gyakran előfordul azonban, hogy a tárolók olyan PROCESSZORkvótát alkalmaznak, amely szabályozhatja a CPU-khoz való hozzáférést.

A JVM heurisztika használatával határozza meg az "elérhető processzorok" számát a CPU-kvóta alapján, ami jelentősen befolyásolhatja Java alkalmazások teljesítményét. A tárolóhoz lefoglalt memória és a JVM halomterületének mérete ugyanolyan fontos, mint a processzorok. Ezek a tényezők határozzák meg a szemétgyűjtő (GC) viselkedését és a rendszer általános teljesítményét.

Új alkalmazás tárolóba helyezése

Ha egy új alkalmazás Java számítási feladatát tárolóba helyezi, két dolgot érdemes figyelembe vennie a memóriával kapcsolatban:

  • A tárolóhoz lefoglalt memória.
  • A Java-folyamat számára rendelkezésre álló memória mennyisége.

A JVM alapértelmezett ergonómiája

Az alkalmazásoknak kiindulópontra és beállításokra van szükségük. A JVM alapértelmezett ergonómiája előre meghatározott értékekkel rendelkezik, amelyek a rendelkezésre álló processzorok számán és a rendszerben lévő memória mennyiségén alapulnak. A JVM az alábbi táblázatokban szereplő alapértelmezett értékeket használja, amikor meghatározott indítási jelzők vagy paraméterek nélkül indítja el.

Az alábbi táblázat az elérhető erőforrásokhoz tartozó alapértelmezett GC-t mutatja:

Elérhető erőforrások Alapértelmezett szemétgyűjtés
Tetszőleges számú processzor
Legfeljebb 1791 MB memória
SerialGC
2+ processzor
1792 MB vagy több memória
G1GC

Az alábbi táblázat az alapértelmezett maximális halomméretet mutatja attól függően, hogy mennyi memória áll rendelkezésre abban a környezetben, ahol a JVM fut:

Rendelkezésre álló memória Alapértelmezett maximális halomméret
Legfeljebb 256 MB Rendelkezésre álló memória: 50%
256 MB–512 MB ~127 MB
Több mint 512 MB 25% rendelkezésre álló memória

Az alapértelmezett kezdeti halomméret a rendelkezésre álló memória 1/64-e. Ezek az értékek érvényesek az OpenJDK 11-hez és újabb verziókhoz – és a legtöbb disztribúcióhoz, például az OpenJDK Microsoft BuildjDK-hoz, az Azul Zuluhoz, az Eclipse Temurinhoz, az Oracle OpenJDK-hoz és más disztribúciókhoz.

Tárolómemória meghatározása

Válasszon egy tárolómemória-mennyiséget, amely az alkalmazás igényeitől és a jellegzetes használati mintáktól függően a legjobban szolgálja ki a számítási feladatot. Ha például az alkalmazás nagyméretű objektumgráfokat hoz létre, valószínűleg több memóriára van szüksége, mint amennyi sok kis objektumdiagrammal rendelkező alkalmazásokhoz szükséges.

Jótanács

Ha nem tudja, hogy mennyi memóriát kell lefoglalni, jó kiindulópont a 4 GB.

JVM-halommemória meghatározása

A JVM-halommemória lefoglalásakor ne feledje, hogy a JVM-nek több memóriára van szüksége, mint a JVM-halomhoz lefoglalt mennyiség. Ne állítsa a maximális JVM-halommemóriát a tárolómemória mennyiségének megfelelő értékre. Ez a beállítás a tároló memórián kívüli (OOM) hibáit és a tároló összeomlását okozhatja.

Jótanács

75% tárolómemória lefoglalása a JVM-halomhoz.

Az OpenJDK 11-es és újabb verzióiban állítsa be a JVM halomméretét az alábbi módok egyikén:

Leírás Zászló Példák
Rögzített érték -Xmx -Xmx4g
Dinamikus érték -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

Minimális vagy kezdeti halomméret

Ha a környezet bizonyos mennyiségű memóriát biztosít egy JVM-példány számára, például egy tárolóban, állítsa a minimális halomméretet vagy a kezdeti halomméretet a maximális halommérettel megegyező méretre. Ez a beállítás azt jelzi a JVM-nek, hogy nem szabadítson fel memóriát az operációs rendszer számára.

A minimális halomméret beállításához használja -Xms az abszolút mennyiségeket vagy -XX:InitialRAMPercentage a százalékos mennyiségeket.

Fontos

Annak ellenére, hogy a név azt sugallja, a jelölő -XX:MinRAMPercentage beállítja az alapértelmezett maximális RAM-százalékot a rendszerben legfeljebb 256 MB RAM-mal rendelkező rendszerek esetében.

Az OpenJDK 17 alapértelmezett halomméretét bemutató diagram.

Meghatározni, melyik szemétgyűjtőt használjuk

Korábban meghatározta, hogy mennyi JVM-halommemória kezdődjön. A következő lépés a GC kiválasztása. A maximális JVM-halommemória mennyisége gyakran befolyásolja a GC kiválasztását. Az alábbi táblázat az egyes GC-k jellemzőit ismerteti.

Tényezők SerialGC ParallelGC G1GC ZGC ShenandoahGC
Magok száma 1 2 2 2 2
Többszálú Nem Igen Igen Igen Igen
Java-halom mérete <4 GB <4 GB >4 GB >4 GB >4 GB
Szünet Igen Igen Igen Igen (<1 ms) Igen (<10 ms)
Felső Minimális Minimális Mérsékelt Mérsékelt Mérsékelt
Vége-latencia Hatás Magas Magas Magas Alacsony Mérsékelt
JDK-verzió Összes Összes JDK 8+ JDK 17+ JDK 11+
A következőkre alkalmas Egymagos kis halmok Többmagos, kis kupacmemóriát használó vagy bármilyen kupacmemória-méretű kötegelt számítási feladatok Reagál közepes vagy nagy munkaterhelés esetén (kérelem-válasz/adatbázis interakciók) Reagál közepes vagy nagy munkaterhelés esetén (kérelem-válasz/adatbázis interakciók) Reagál közepes vagy nagy munkaterhelés esetén (kérelem-válasz/adatbázis interakciók)

Jótanács

A legtöbb általános célú mikroszolgáltatás-alkalmazás esetében kezdje a párhuzamos GC-vel.

Annak meghatározása, hogy hány processzormagra van szüksége

A SerialGC kivételével minden GC esetén használjon két vagy több vCPU-magot – vagy Kubernetesen legalább 2000m értéket a(z) cpu_limit számára. Tárolóalapú környezetekben ne válasszon egynél kevesebb vCPU-magot.

Jótanács

Ha nem tudja, hány maggal kezdjen, jó választás két vCPU-mag.

Kiindulási pont kiválasztása

Kezdje két replikával vagy példánysal a tárolóvezénylési környezetekben, például a Kubernetesben, az OpenShiftben, a Azure Spring Apps, a Azure Container Apps és a Azure App Service. Az alábbi táblázat összefoglalja az új Java-alkalmazás tárolóba való tárolásának ajánlott kiindulópontjait.

vCPU-magok Konténermemória JVM halomméret szemétgyűjtés Replikák
2 4 GB 75% ParallelGC 2

Használja a következő JVM-paramétereket:

-XX:+UseParallelGC -XX:MaxRAMPercentage=75

Meglévő helyszíni alkalmazás tárolóba helyezése

Ha az alkalmazás már fut a helyszínen vagy egy felhőbeli virtuális gépen, kezdje a következő konfigurációval:

  • Ugyanaz a memóriamennyiség, amelyhez az alkalmazásnak jelenleg hozzáférése van.
  • Az alkalmazás által jelenleg elérhető cpu-k vagy vCPU-magok száma.
  • Ugyanazok a JVM-paraméterek, amelyeket jelenleg használ.

Ha a vCPU-magok vagy tárolómemória-kombináció nem érhető el, válassza ki a legközelebbit, és kerekítse fel a vCPU-magokat és a tárolómemóriát.

Következő lépések

Most, hogy megismerte az Java alkalmazások tárolóba helyezésére vonatkozó általános javaslatokat, folytassa a következő cikkel a tárolókezelési alapkonfiguráció létrehozásához: