Java Heap Space Memory a Runtime API-val

1. Áttekintés

Ebben a cikkben megvitatjuk a Java által biztosított API-kat, amelyek segíthetnek megérteni a Java halomtérrel kapcsolatos számos szempontot.

Ez hasznos lehet a JVM aktuális memóriaállapotának megértésében, és olyan felügyeleti szolgáltatásokba történő kiszervezésében, mint a StatsD és a Datadog, amelyek ezután konfigurálhatók megelőző tevékenységre és az alkalmazáshibák elkerülésére.

2. Hozzáférés a memória paraméterekhez

Minden Java alkalmazásnak egyetlen példánya van java.lang.Runtime ez segíthet megérteni az alkalmazás aktuális memóriaállapotát. A Futásidejű # getRuntime statikus módszer hívható meg a szingulett megszerzéséhez Futásidő példa.

2.1. Teljes memória

A Futásidejű # getTotalMemory metódus adja vissza a JVM által jelenleg bájtokban lefoglalt teljes halomteret. Ez magában foglalja a jelenlegi és a jövőbeli objektumok számára fenntartott memóriát. Ezért nem garantált, hogy állandó lesz a program végrehajtása során, mivel a Java halom területe bővíthető vagy csökkenthető, ha több objektumot osztanak ki.

Is, ez az érték nem feltétlenül a használt vagy a maximálisan rendelkezésre álló memória.

2.2. Szabad memória

A Futásidejű # freeMemory metódus adja vissza az új objektum-allokációkhoz rendelkezésre álló szabad halomterületet bájtokban. Ez növekedhet egy szemétszedési művelet eredményeként, ahol több szabad memória áll rendelkezésre utána.

2.3. Maximális memória

A Futásidejű # maxMemory metódus adja vissza a JVM által megkísérelt maximális memóriát. Amint a JVM memóriahasználata eléri ezt az értéket, akkor nem oszt ki több memóriát és helyette, és gyakrabban gyűjt szemetet.

Ha a JVM objektumoknak még a memóriagyűjtő futtatása után is több memóriára van szükségük, akkor a JVM dobhat egy java.lang.OutOfMemoryError futásidejű kivétel.

3. Példa

Az alábbi példában inicializálunk egy Tömb lista és adjon hozzá elemeket, miközben nyomon követi a JVM kupacterét a fenti három módszer segítségével:

ArrayList arrayList = új ArrayList (); System.out.println ("i \ t szabad memória \ t teljes memória \ t max memória"); for (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 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 ...
  • 1498. sor: A Futásidejű # freeMemory Az érték csökken, ha elegendő objektumnak van helye a Java kupacban.
  • 900080. sor: Ezen a ponton a JVM-nek több helye van, mivel a GC futott, ezért a Futásidejű # freeMemory és Futásidejű # totalMemory növekedés.

A fent bemutatott értékek várhatóan eltérőek lesznek egy Java alkalmazás minden futtatásakor.

4. A memória paramétereinek testreszabása

Felülírhatjuk a JVM memóriaparaméterek alapértelmezett értékeit, ha a Java program futtatásakor egyéni értékeket állítunk be bizonyos zászlókra a kívánt memória teljesítmény elérése érdekében:

  • -Xms: A hozzárendelt érték -Xms flag beállítja a Java halom kezdeti és minimális értékét. Olyan esetekben használható, amikor alkalmazásunk a JVM indításakor az alapértelmezett minimumnál több memóriát igényel
  • -Xmx: Hasonlóképpen megadhatjuk a kupacterület maximális értékét is -Xmx zászló. Akkor használható, ha korlátozni akarjuk az alkalmazásunk által használni kívánt memória mennyiségét.

Kérjük, vegye figyelembe, hogy a -Xms értékének egyenlőnek vagy kisebbnek kell lennie, mint a -Xmx érték.

4.1. Használat

java -Xms32M -Xmx64M Fő szabad memória: 31792664 bájt Összes memória: 32505856 bájt Maximális memória: 59768832 bájt java -Xms64M -Xmx64M Fő szabad memória: 63480640 bájt Összes memória: 64487424 bájt Maximális memória: 64487424 bytes Maximális memória: 64487424 bájt -Xx64M a virtuális gép inicializálása során A kezdeti kupacméret nagyobb értékre van beállítva, mint a maximális kupacméret

5. Következtetés

Ebben a cikkben azt láttuk, hogyan lehet lekérni a JVM memória mutatóit a Futásidő osztály. Ezek a módszerek hasznosak lehetnek a JVM memóriaszivárgások és más JVM memóriateljesítményhez kapcsolódó problémák kivizsgálásakor.

Bemutattuk azt is, hogyan rendelhetünk egyedi értékeket bizonyos zászlókhoz, amelyek különböző JVM memória viselkedést eredményeznek különböző forgatókönyvek esetén.