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.