Share via


Problemen met opnieuw opstarten van apps die worden veroorzaakt door problemen met onvoldoende geheugen

Notitie

Azure Spring Apps is de nieuwe naam voor de Azure Spring Cloud-service. Hoewel de service een nieuwe naam heeft, ziet u de oude naam op sommige plaatsen terwijl we werken aan het bijwerken van assets, zoals schermopnamen, video's en diagrammen.

Dit artikel is van toepassing op: ✔️ Basic/Standard ✔️ Enterprise

In dit artikel worden problemen met onvoldoende geheugen (OOM) voor Java-toepassingen in Azure Spring Apps beschreven.

Typen problemen met onvoldoende geheugen

Er zijn twee soorten problemen met onvoldoende geheugen: container OOM en JVM OOM.

  • Container OOM, ook wel systeem-OOM genoemd, treedt op wanneer het beschikbare app-geheugen is opgelopen. Container OOM-probleem veroorzaakt opnieuw opstarten van apps, die worden gerapporteerd in de sectie Resource Health van Azure Portal. Normaal gesproken wordt container-OOM veroorzaakt door onjuiste configuraties van de geheugengrootte.

  • JVM OOM treedt op wanneer de hoeveelheid gebruikt geheugen de maximale grootte heeft bereikt die is ingesteld in JVM-opties. JVM OOM zorgt er niet voor dat een app opnieuw wordt opgestart. Normaal gesproken is JVM OOM een resultaat van ongeldige code, die u kunt vinden door te zoeken naar java.lang.OutOfMemoryError uitzonderingen in het toepassingslogboek. JVM OOM heeft een negatief effect op de hulpprogramma's voor toepassings- en Java-profilering, zoals Java Flight Recorder.

Dit artikel is gericht op het oplossen van problemen met container-OOM. Als u JVM OOM-problemen wilt oplossen, controleert u hulpprogramma's zoals heapdump, threaddump en Java Flight Recorder. Zie Capture heapdump en threaddump handmatig en gebruik Java Flight Recorder in Azure Spring Apps voor meer informatie.

Problemen met opnieuw opstarten van apps oplossen vanwege OOM

In de volgende secties worden de hulpprogramma's, metrische gegevens en JVM-opties beschreven die u kunt gebruiken om problemen met container-OOM vast te stellen en op te lossen.

Waarschuwingen weergeven op de pagina Resourcestatus

Op de pagina Resourcestatus in Azure Portal worden gebeurtenissen voor het opnieuw opstarten van apps weergegeven vanwege container-OOM, zoals wordt weergegeven in de volgende schermopname:

Screenshot of Azure portal showing Azure Spring Apps Resource Health page with OOM message highlighted.

Geheugengrootte configureren

Het geheugengebruikjvm.memory.used van de app voor metrische gegevens en jvm.memory.committed geeft een overzicht van het geheugengebruik. Zie de sectie Metrische gegevens van Hulpprogramma's voor het oplossen van geheugenproblemen voor meer informatie. Configureer de maximale geheugengrootten in JVM-opties om ervoor te zorgen dat het geheugen onder de limiet valt.

De som van de maximale geheugengrootten van alle onderdelen in het Java-geheugenmodel moet kleiner zijn dan het werkelijke beschikbare app-geheugen. Als u de maximale geheugengrootten wilt instellen, raadpleegt u de typische geheugenindeling die wordt beschreven in de sectie Geheugengebruik vanJava-geheugenbeheer.

Zoek een balans wanneer u de maximale geheugengrootte instelt. Wanneer u de maximale geheugengrootte te hoog instelt, is er een risico op container-OOM. Wanneer u de maximale geheugengrootte te laag instelt, bestaat het risico op JVM OOM en wordt de garbagecollection van de app vertraagd.

Heap-geheugen beheren

U kunt de maximale heapgrootte instellen met behulp van de -Xmsopties , -Xmxen -XX:MaxRAMPercentage-XX:InitialRAMPercentageJVM.

Mogelijk moet u de instellingen voor de maximale heapgrootte aanpassen wanneer de waarde jvm.memory.used te hoog is in de metrische gegevens. Zie de sectie jvm.memory.used/commit/max van Tools voor het oplossen van geheugenproblemen voor meer informatie.

Direct geheugen beheren

Het is belangrijk om de -XX:MaxDirectMemorySize JVM-optie in te stellen om de volgende redenen:

  • U ziet mogelijk niet wanneer frameworks zoals nio en gzip direct geheugen gebruiken.
  • Garbagecollection van direct geheugen wordt alleen verwerkt tijdens volledige garbagecollection en volledige garbagecollection vindt alleen plaats wanneer de heap bijna vol is.

Normaal gesproken kunt u instellen MaxDirectMemorySize op een waarde die kleiner is dan de grootte van het app-geheugen min het heap-geheugen minus het niet-heapgeheugen.

Besturingselementmetaruimte

U kunt de maximale grootte van de metaruimte instellen door de -XX:MaxMetaspaceSize JVM-optie in te stellen. Met -XX:MetaspaceSize de optie wordt de drempelwaarde ingesteld om volledige garbagecollection te activeren.

Metaspacegeheugen is meestal stabiel.

Zie ook