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.

Java-alkalmazások tárolóba helyezésekor gondosan gondolja át, hogy mennyi processzoridő áll rendelkezésre a tárolóban. Ezután fontolja meg, hogy mennyi memória lesz elérhető 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 CPU-kvótát alkalmaznak, amely szabályozhatja a CPU-khoz való hozzáférést.

A JVM heurisztikus módon határozza meg az "elérhető processzorok" számát a CPU-kvóta alapján, ami jelentősen befolyásolhatja a 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

Amikor java számítási feladatot helyez tárolóba egy új alkalmazáshoz, két dolgot kell figyelembe vennie a memóriára való gondolkodás során:

  • 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 ergonomikus, 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. Az alábbi táblázatokban szereplő alapértelmezett értékek akkor használatosak, ha a JVM adott indítási jelzők vagy paraméterek nélkül indul el.

Az alábbi táblázat az elérhető erőforrásokhoz használt alapértelmezett csoportházirend-objektumot mutatja be:

Elérhető erőforrások Alapértelmezett csoportházirend-objektum
Tetszőleges számú processzor
Akár 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 A rendelkezésre álló memória 50%-a
256 MB–512 MB ~127 MB
Több mint 512 MB A rendelkezésre álló memória 25%-a

Az alapértelmezett kezdeti halomméret a rendelkezésre álló memória 1/64-e.

Ezek az értékek az OpenJDK 11-s és újabb verzióira, valamint a legtöbb disztribúcióra érvényesek, beleértve az OpenJDK Microsoft Buildet, az Azul Zulut, az Eclipse Temurint, az Oracle OpenJDK-t és másokat.

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

Válasszon egy tárolómemória-mennyiséget, amely a legjobban kiszolgálja a munkahelyi terhelést az alkalmazás igényeitől és a jellegzetes használati mintáktól függően. Ha például az alkalmazás nagyméretű objektumgráfokat hoz létre, akkor valószínűleg több memóriára lesz szüksége, mint amennyi a sok kis objektumdiagramot tartalmazó alkalmazásokhoz szükséges.

Tipp.

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 vegye figyelembe, hogy a JVM-nek több memóriára van szüksége, mint amennyit a JVM-halomhoz használ. A maximális JVM-halommemória beállításakor soha nem lehet egyenlő a tárolómemória mennyiségével, mert ez a tároló memóriahiányos (OOM) hibáit és tárolóösszeomlásokat okoz.

Tipp.

Foglalja le a tárolómemória 75%-át a JVM-halomhoz.

Az OpenJDK 11-es és újabb verzióiban a JVM halomméretét a következő módokon állíthatja be:

Leírás Jelölő Példák
Rögzített érték -Xmx -Xmx4g
Dinamikus érték -XX:MaxRAMPercentage -XX:MaxRAMPercentage=75

Minimális/kezdeti halomméret

Ha a környezet garantáltan egy JVM-példány számára fenntartott memóriával rendelkezik, például egy tárolóban, a minimális halomméretet – vagy a kezdeti halomméretet – a maximális halommérettel megegyező méretűre kell állítania. 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

A jelölő -XX:MinRAMPercentage– a név által sugalltak ellenére – a rendszerben legfeljebb 256 MB RAM-mal rendelkező rendszerek alapértelmezett maximális RAM-százalékos értékének beállítására szolgál.

Chart showing the default heap size on OpenJDK 17.

A használni kívánt csoportházirend-objektum meghatározása

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 tényező a GC kiválasztásában. 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álas Nem Yes Yes Yes Igen
Java-halom mérete <4 GB <4 GB >4 GB >4 GB >4 GB
Szünet Igen Yes Igen Igen (<1 ms) Igen (<10 ms)
Felső Minimális Minimális Mérsékelt Mérsékelt Mérsékelt
Tail-latency Effect Magas Magas Magas Alacsony Mérsékelt
JDK-verzió Mind Mind JDK 8+ JDK 17+ JDK 11+
A következőkre alkalmas Egymagos kis halom Többmagos kis halom vagy kötegelt számítási feladatok bármilyen halommérettel Válasz közepes vagy nagy halomban (kérelem-válasz/DB interakciók) Válasz közepes vagy nagy halomban (kérelem-válasz/DB interakciók) Válasz közepes vagy nagy halomban (kérelem-válasz/DB interakciók)

Tipp.

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ég

A SerialGC-n kívül minden GC-hez két vagy több vCPU-magot ajánlunk – vagy legalább 2000mcpu_limit a Kubernetesen. Nem javasoljuk, hogy 1 vCPU-magnál kevesebbet válasszon a tárolóalapú környezetekben.

Tipp.

Ha nem tudja, hány maggal kezdjen, jó választás 2 vCPU mag.

Kiindulási pont kiválasztása

Javasoljuk, hogy kezdjen két replikával vagy példánysal a tárolóvezénylési környezetekben, például a Kubernetesben, az OpenShiftben, az Azure Spring Appsben, az Azure Container Appsben és a Azure-alkalmazás Szolgáltatásban. 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 Tárolómemória JVM halomméret GC Replicas
2 4 GB 75% ParallelGC 2

A használni kívánt JVM-paraméterek a következők: -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 a felhőben lévő virtuális gépen, javasoljuk, hogy kezdje a következőkkel:

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

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

További lépések

Most, hogy megismerte a 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: