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.
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 | 0 | 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 |
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 2000m
cpu_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 | Replikák |
---|---|---|---|---|
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.
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: