Megosztás a következőn keresztül:


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 á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 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 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 a legjobban szolgálja ki a munkaterhelé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 van szüksége, mint amennyi sok kis objektumgráfot tartalmazó 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 kupac memória lefoglalásakor a JVM-nek több memóriára van szüksége, mint amit a kupac 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 a tároló összeomlását okozza.

Jótanács

75% tárolómemória lefoglalása 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 Zászló 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.

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 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 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 halom vagy kötegelt számítási feladatok bármilyen halommérettel 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ég

A SerialGC-n kívül minden GC-hez két vagy több vCPU-magot ajánlunk – vagy legalábbis 2000m a Kuberneteshez cpu_limit . Nem javasoljuk, hogy egynél kevesebb vCPU-magot válasszon a tárolóalapú környezetekben.

Jótanács

Ha nem tudja, hány maggal kezdjen, jó választás két 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 az Azure App Service-ben. 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 GC 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 a felhőben lévő virtuális gépen, javasoljuk, hogy 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 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: