Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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: