Java Heap Space Memory met de Runtime API

1. Overzicht

In dit artikel bespreken we de API's die door Java worden geleverd en die ons kunnen helpen de verschillende aspecten van Java-heapspace te begrijpen.

Dit kan handig zijn om de huidige geheugenstatus van de JVM te begrijpen en deze uit te besteden aan monitoringdiensten zoals StatsD en Datadog, die vervolgens kunnen worden geconfigureerd om preventieve actie te ondernemen en applicatiefouten te voorkomen.

2. Toegang tot geheugenparameters

Elke Java-applicatie heeft één exemplaar van java.lang.Runtime die ons kunnen helpen de huidige geheugenstatus van de applicatie te begrijpen. De Runtime # getRuntime statische methode kan worden aangeroepen om de singleton te krijgen Looptijd voorbeeld.

2.1. Totaal geheugen

De Runtime # getTotalMemory methode retourneert de totale heapruimte die momenteel is gereserveerd door de JVM in bytes. Het bevat het geheugen dat is gereserveerd voor huidige en toekomstige objecten. Daarom is het niet gegarandeerd dat het constant is tijdens de uitvoering van het programma, aangezien de Java-heapruimte kan worden uitgebreid of verkleind naarmate er meer objecten worden toegewezen.

Ook, deze waarde is niet noodzakelijk wat er in gebruik is of het maximale beschikbare geheugen.

2.2. Vrij geheugen

De Runtime # freeMemory method geeft de vrije heapruimte terug die beschikbaar is voor nieuwe objecttoewijzingen in bytes. Het kan toenemen als gevolg van een garbagecollection-bewerking waarbij daarna meer vrij geheugen beschikbaar is.

2.3. Maximaal geheugen

De Runtime # maxMemory methode retourneert het maximale geheugen dat de JVM zal proberen te gebruiken. Zodra het JVM-geheugengebruik deze waarde bereikt, zal het niet meer geheugen toewijzen en zal het in plaats daarvan vaker garbage collecteren.

Als de JVM-objecten nog steeds meer geheugen nodig hebben, zelfs nadat de garbage collector is uitgevoerd, kan de JVM een java.lang.OutOfMemoryErroruntime-uitzondering.

3. Voorbeeld

In het onderstaande voorbeeld initialiseren we een ArrayList en voeg er elementen aan toe terwijl je de JVM-heapruimte bijhoudt met behulp van de bovenstaande drie methoden:

ArrayList arrayList = nieuwe ArrayList (); System.out.println ("i \ t Vrij geheugen \ t Totaal geheugen \ t Max. Geheugen"); voor (int i = 0; i <1000000; i ++) {arrayList.add (i); System.out.println (i + "\ t" + Runtime.getRuntime (). FreeMemory () + "\ t \ t" + Runtime.getRuntime (). TotalMemory () + "\ t \ t" + Runtime.getRuntime () .maxMemory ()); } // ...
Output: i Free Memory Totaal geheugen Max Memory 0 254741016 257425408 3817865216 1 254741016 257425408 3817865216 ... 1498 254741016 257425408 3817865216 1499 253398840 257425408 3817865216 1500 253398840 257425408 3817865216 ... 900079 179608120 260046848 3817865216 900080 302140152 324534272 3817865216 900081 302140152 324534272 3817865216 ...
  • Rij 1498: The Runtime # freeMemory waarde neemt af wanneer aan voldoende objecten ruimte is toegewezen in de Java-heap.
  • Rij 900080: op dit punt heeft de JVM meer ruimte beschikbaar omdat GC is uitgevoerd, vandaar de waarden van Runtime # freeMemory en Runtime # totalMemory toename.

De waarden die hierboven worden weergegeven, zullen naar verwachting bij elke uitvoering van een Java-applicatie anders zijn.

4. Geheugenparameters aanpassen

We kunnen de standaardwaarden voor de JVM-geheugenparameters overschrijven door aangepaste waarden in te stellen op bepaalde vlaggen bij het uitvoeren van ons Java-programma om de vereiste geheugenprestaties te bereiken:

  • -Xms: De waarde die is toegewezen aan -Xms flag stelt de begin- en minimumwaarde van de Java-heap in. Het kan worden gebruikt in gevallen waarin onze applicatie meer geheugen nodig heeft dan het standaard minimum bij het starten van de JVM
  • -Xmx: Evenzo kunnen we de maximale waarde voor de heap-ruimte instellen door deze toe te wijzen aan -Xmx vlag. Het kan worden gebruikt wanneer we de hoeveelheid geheugen die onze applicatie met opzet zal gebruiken, willen beperken.

Houd er ook rekening mee dat de -Xms waarde moet gelijk zijn aan of kleiner zijn dan de -Xmx waarde.

4.1. Gebruik

java -Xms32M -Xmx64M Vrij hoofdgeheugen: 31792664 bytes Totaal geheugen: 32505856 bytes Max. geheugen: 59768832 bytes java -Xms64M -Xmx64M Vrij hoofdgeheugen: 63480640 bytes Totaal geheugen: 64487424 bytes Max. geheugen: 64487424 bytes java -Xms64M -Xmx32M Hoofdfout tijdens initialisatie van VM Initiële heapgrootte ingesteld op een grotere waarde dan de maximale heapgrootte

5. Conclusie

In dit artikel hebben we gezien hoe u metrische gegevens over JVM-geheugen kunt ophalen via de Looptijd klasse. Deze methoden kunnen handig zijn bij het onderzoeken van JVM-geheugenlekken en andere problemen met JVM-geheugenprestaties.

We hebben ook laten zien hoe u aangepaste waarden toewijst voor bepaalde vlaggen die leiden tot een ander JVM-geheugengedrag voor verschillende scenario's.