Sdílet prostřednictvím


Problémy s restartováním aplikace způsobené problémy s nedostatkem paměti

Poznámka:

Plány Basic, Standard a Enterprise budou od poloviny března 2025 vyřazeny ze 3letého období vyřazení. Doporučujeme přejít na Azure Container Apps. Další informace najdete v oznámení o vyřazení Azure Spring Apps.

Od 30. září 2024 bude od 30. září 2024 zastaralý plán s úplným vypnutím po šesti měsících. Doporučujeme přejít na Azure Container Apps. Další informace najdete v tématu Migrace spotřeby Azure Spring Apps Úrovně Standard a vyhrazeného plánu do Azure Container Apps.

Tento článek se vztahuje na:✅ Basic/Standard ✅ Enterprise

Tento článek popisuje problémy s nedostatkem paměti (OOM) pro aplikace Java v Azure Spring Apps.

Typy problémů s nedostatkem paměti

Existují dva typy problémů s nedostatkem paměti: OOM kontejneru a OOM JVM.

  • Kontejner OOM, označovaný také jako systémový objekt OOM, nastane, když dojde k nedostatku dostupné paměti aplikace. Problém s objektem OOM kontejneru způsobuje události restartování aplikace, které jsou hlášeny v části Resource Health na webu Azure Portal. Za normálních okolností je objekt OOM kontejneru způsoben nesprávnými konfiguracemi velikosti paměti.

  • Prostředí JVM OOM nastane, když množství využité paměti dosáhlo maximální velikosti nastavené v možnostech JVM. JVM OOM nezpůsobí restartování aplikace. JVM OOM je obvykle výsledkem chybného kódu, který můžete najít vyhledáním java.lang.OutOfMemoryError výjimek v protokolu aplikace. JVM OOM má negativní vliv na aplikace a nástroje pro profilaci Javy, jako je Java Flight Recorder.

Tento článek se zaměřuje na řešení problémů s objekty OOM kontejneru. Pokud chcete vyřešit problémy S OOM prostředí JVM, zkontrolujte nástroje, jako jsou výpis paměti haldy, výpis vlákna a Nástroj Java Flight Recorder. Další informace najdete v tématu Zachycení výpisu paměti haldy a výpisu vláken ručně a použití nástroje Java Flight Recorder v Azure Spring Apps.

Řešení problémů s restartováním aplikace kvůli OOM

Následující části popisují nástroje, metriky a možnosti prostředí JVM, které můžete použít k diagnostice a opravě problémů s objekty OOM kontejneru.

Zobrazení upozornění na stránce Resource Health

Na stránce Resource Health na webu Azure Portal se zobrazují události restartování aplikace kvůli objektu OOM kontejneru, jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky webu Azure Portal zobrazující stránku Azure Spring Apps Resource Health se zvýrazněnou zprávou OOM

Konfigurace velikosti paměti

Metriky Využitíjvm.memory.used paměti aplikace a jvm.memory.committed poskytují zobrazení využití paměti. Další informace najdete v části Metriky nástroje pro řešení problémů s pamětí. Nakonfigurujte maximální velikost paměti v možnostech prostředí JVM, abyste měli jistotu, že je paměť pod limitem.

Součet maximální velikosti paměti všech částí v modelu paměti Java by měl být menší než skutečná dostupná paměť aplikace. Pokud chcete nastavit maximální velikost paměti, podívejte se na typické rozložení paměti popsané v části Rozložení využití paměti v jazyce Java.

Když nastavíte maximální velikost paměti, najděte rovnováhu. Když nastavíte příliš vysokou velikost maximální paměti, hrozí riziko OOM kontejneru. Když nastavíte příliš malou maximální velikost paměti, hrozí riziko, že prostředí JVM OOM bude mít a zpomalí aplikaci uvolňování paměti.

Řízení paměti haldy

Maximální velikost haldy můžete nastavit pomocí -Xmsmožností , -Xmx, -XX:InitialRAMPercentagea -XX:MaxRAMPercentage JVM.

Pokud je hodnota jvm.memory.used příliš vysoká v metrikách, budete možná muset upravit nastavení maximální velikosti haldy. Další informace najdete v části jvm.memory.used/committed/max nástroje pro řešení problémů s pamětí.

Řízení přímé paměti

Možnost JVM je důležité nastavit -XX:MaxDirectMemorySize z následujících důvodů:

  • Nemusíte si všimnout, když architektury, jako je nio a gzip, používají přímou paměť.
  • Uvolňování paměti s přímým přístupem se zpracovává pouze během úplného uvolňování paměti a úplné uvolňování paměti nastane pouze v případě, že halda je téměř plná.

Za normálních okolností můžete nastavit MaxDirectMemorySize hodnotu menší než velikost paměti aplikace minus paměť haldy minus paměť bez haldy.

Řízení metaprostoru

Maximální velikost metaprostoru můžete nastavit nastavením -XX:MaxMetaspaceSize možnosti JVM. Tato -XX:MetaspaceSize možnost nastaví prahovou hodnotu pro aktivaci úplného uvolňování paměti.

Paměť metaprostoru je obvykle stabilní.

Viz také