Permgen vs Metaspace a Java-ban

1. Bemutatkozás

Ebben a gyors bemutatóban megvizsgáljuk a PermGen és a Metaspace memóriaterületek közötti különbségeket Java környezetben.

Fontos szem előtt tartani, hogy a Java 8-tól kezdve a Metaspace helyettesíti a PermGen-t - lényeges változásokat hozva.

2. PermGen

A PermGen (Permanent Generation) egy speciális halomtér, amelyet elválasztanak a fő memóriakupactól.

A JVM nyomon követi a betöltett osztály metaadatokat a PermGen-ben. Ezenkívül a JVM az összes statikus tartalmat ebben a memória szakaszban tárolja. Ez magában foglalja az összes statikus módszert, primitív változót és hivatkozást a statikus objektumokra.

Továbbá, adatokat tartalmaz a bytecode-ról, a nevekről és a JIT-információkról. A Java 7 előtt a String Pool is része volt ennek az emlékezetnek. A rögzített medence méretének hátrányait az írásunkban soroljuk fel.

A 32 bites JVM alapértelmezett maximális memóriamérete 64 MB, a 64 bites verzió esetében pedig 82 MB.

Az alapértelmezett méretet azonban a JVM opcióival módosíthatjuk:

  • -XX: PermSize = [méret] a PermGen tér kezdeti vagy minimális mérete
  • -XX: MaxPermSize = [méret] a maximális méret

A legfontosabb, Az Oracle teljesen eltávolította ezt a memóriaterületet a JDK 8 kiadásában. Ezért, ha ezeket a tuning zászlókat használjuk a Java 8 és újabb verzióiban, a következő figyelmeztetéseket kapjuk:

>> java -XX: PermSize = 100m -XX: MaxPermSize = 200m -version OpenJDK 64 bites kiszolgáló virtuális gép figyelmeztetése: A PermSize opció figyelmen kívül hagyása; a 8.0 OpenJDK 64 bites kiszolgáló virtuális gép figyelmeztetését eltávolították: figyelmen kívül hagyta a MaxPermSize opciót; a támogatást a 8.0-ban eltávolították ...

Korlátozott memóriaméretével a PermGen részt vesz a híresek létrehozásában OutOfMemoryError. Egyszerűen fogalmazva: az osztályos rakodók nem voltak megfelelően gyűjtve szemetet, és ennek következtében memóriaszivárgást okoztak.

Ezért memóriaterület-hibát kapunk; ez leginkább a fejlesztői környezetben történik, miközben új osztályos rakodókat hoznak létre.

3. Metaspace

Egyszerűen fogalmazva: a Metaspace egy új memóriaterület - a Java 8 verziótól kezdve; lecserélte a régebbi PermGen memóriaterületet. A legjelentősebb különbség az, hogyan kezeli a memóriaallokációt.

Kimondottan, ez a natív memória régió alapértelmezés szerint automatikusan növekszik.

Új zászlókkal is rendelkezünk a memória hangolásához:

  • MetaspaceSize és MaxMetaspaceSize - beállíthatjuk a Metaspace felső határait.
  • MinMetaspaceFreeRatio - az osztály metaadatainak minimális százalékos aránya a szemétszállítás után
  • MaxMetaspaceFreeRatio - az osztály metaadatainak maximális százalékos aránya szabad a szemétszállítás után, hogy elkerülhető legyen a hely mennyiségének csökkenése

Ezenkívül a szemétszállítási folyamat is profitál ebből a változásból. A szemétgyűjtő most automatikusan elindítja a holt osztályok tisztítását, amint az osztály metaadatainak használata eléri a maximális metatér méretet.

Ebből kifolyólag, ezzel a fejlesztéssel a JVM csökkenti a Elfogyott a memória hiba.

Mindezen fejlesztések ellenére továbbra is figyelemmel kell kísérnünk és hangolnunk kell a metatéret a memóriaszivárgások elkerülése érdekében.

4. Összefoglalás

Ebben a gyors írásban bemutattuk a PermGen és a Metaspace memóriaterületek rövid leírását. Ezenkívül elmagyaráztuk a legfontosabb különbségeket mindegyik között.

A PermGen még mindig a JDK 7 és régebbi verzióival rendelkezik, de a Metaspace rugalmasabb és megbízhatóbb memóriahasználatot kínál alkalmazásaink számára.