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.