Java halda vesmírna pamäť s Runtime API

1. Prehľad

V tomto článku sa budeme zaoberať API poskytovanými Java, ktoré nám môžu pomôcť pochopiť niekoľko aspektov týkajúcich sa haldy priestoru Java.

To môže byť užitočné pri porozumení aktuálneho stavu pamäte JVM a jeho outsourcingu na monitorovacie služby, ako sú StatsD a Datadog, ktoré je potom možné nakonfigurovať na preventívne opatrenia a predchádzanie zlyhaniam aplikácií.

2. Prístup k parametrom pamäte

Každá Java aplikácia má jednu inštanciu java.lang.Runtime ktoré nám môžu pomôcť pochopiť aktuálny stav pamäte aplikácie. The Runtime # getRuntime na získanie singletonu je možné zavolať statickú metódu Beh programu inštancia.

2.1. Celková pamäť

The Runtime # getTotalMemory metóda vráti celkový priestor haldy momentálne rezervovaný JVM v bajtoch. Zahŕňa pamäť vyhradenú pre súčasné a budúce objekty. Preto nie je zaručené, že bude konštantná počas vykonávania programu, pretože priestor haldy Java je možné rozširovať alebo zmenšovať pri prideľovaní ďalších objektov.

Tiež táto hodnota nie je nevyhnutne to, čo sa používa, alebo maximálna dostupná pamäť.

2.2. Voľná ​​pamäť

The Runtime # freeMemory metóda vráti voľné haldy dostupné pre nové alokácie objektov v bajtoch. Môže sa zvýšiť v dôsledku operácie odvozu odpadu, kde je po nej k dispozícii viac voľnej pamäte.

2.3. Maximálna pamäť

The Runtime # maxMemory metóda vráti maximálnu pamäť, ktorú sa JVM pokúsi použiť. Akonáhle využitie pamäte JVM dosiahne túto hodnotu, nebude alokovať viac pamäte a namiesto toho a bude sa častejšie zhromažďovať odpadky.

Ak objekty JVM stále potrebujú viac pamäte aj po spustení zberača odpadu, potom môže JVM vyhodiť a java.lang.OutOfMemoryError runtime výnimka.

3. Príklad

V nasledujúcom príklade inicializujeme znak ArrayList a pridajte doň prvky a súčasne sledujte priestor haldy JVM pomocou vyššie uvedených troch metód:

ArrayList arrayList = nový ArrayList (); System.out.println ("i \ t voľná pamäť \ t celková pamäť \ t maximálna pamäť"); pre (int i = 0; i <10 000 000; i ++) {arrayList.add (i); System.out.println (i + "\ t" + Runtime.getRuntime (). FreeMemory () + "\ t \ t" + Runtime.getRuntime (). TotalMemory () + "\ t \ t" + Runtime.getRuntime () .maxMemory ()); } // ...
Výstup: i voľnej pamäte Total Memory 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 ...
  • Riadok 1498: The Runtime # freeMemory hodnota sa zníži, keď je v halde Java pridelený priestor dostatočnému počtu objektov.
  • Riadok 900080: V tomto okamihu má JVM k dispozícii viac priestoru, pretože bežal GC, teda hodnoty Runtime # freeMemory a Runtime # totalMemory zvýšiť.

Očakáva sa, že vyššie uvedené hodnoty sa budú líšiť pri každom spustení aplikácie Java.

4. Prispôsobenie parametrov pamäte

Predvolené hodnoty pre parametre pamäte JVM môžeme prepísať nastavením vlastných hodnôt na určité príznaky pri spustení nášho programu Java, aby sme dosiahli požadovaný výkon pamäte:

  • -Xms: Hodnota priradená k -Xms flag nastavuje počiatočnú a minimálnu hodnotu haldy Java. Môže sa použiť v prípadoch, keď naša aplikácia vyžaduje pri spustení JVM viac pamäte, ako je predvolené minimum
  • -Xmx: Rovnako môžeme priradiť maximálnu hodnotu pre haldy priestor -Xmx vlajka. Môže sa použiť, keď chceme zámerne obmedziť množstvo pamäte, ktoré bude naša aplikácia využívať.

Upozorňujeme tiež, že -Xms hodnota musí byť rovnaká alebo menšia ako -Xmx hodnotu.

4.1. Využitie

java -Xms32M -Xmx64M hlavná voľná pamäť: 31792664 bajtov celková pamäť: 32505856 bajtov maximálna pamäť: 59768832 bajtov java -Xms64M -Xmx64M hlavná voľná pamäť: 63480640 bajtov celková pamäť: 64487424 bajtov maximálna pamäť: 64487424 bajtov došlo k jave -Xms64M -Xmx32 počas inicializácie VM Počiatočná veľkosť haldy nastavená na väčšiu hodnotu ako maximálna veľkosť haldy

5. Záver

V tomto článku sme videli, ako načítať metriky pamäte JVM pomocou Beh programu trieda. Tieto metódy môžu byť užitočné pri vyšetrovaní úniku pamäte JVM a iných problémov týkajúcich sa výkonu pamäte JVM.

Tiež sme si ukázali, ako priradiť vlastné hodnoty pre určité príznaky, ktoré vedú k odlišnému chovaniu pamäte JVM pre rôzne scenáre.


$config[zx-auto] not found$config[zx-overlay] not found