Skip to end of metadata
Go to start of metadata

Biztos mindenkivel előfordult már, hogy a JBoss vagy a Tomcat (illetve egyéb nagyobbnak mondható keretrendszer) futása megszakadt org.apache.jasper.JasperException: PermGen space hibával. Ennek oka, hogy a JVM nem takarítja ki a permanens memóriaterületet, holott lenne rá lehetősége is ideje is. És még hasznos is lehetne. Karmazilla blogjában éppen erről a problémáról ír, s ami lényeges, megoldást is talált.

A GC nem foglalkozik a permanens területtel, de a CGC (concurrent garbage collector) igen. Az első dolog, hogy ennek futását engedélyezzük a VM számára:

-XX:+UseConcMarkSweepGC

Ez még nem elég, ugyanis engedélyeznünk kell a permanens terület kiürítését is:

-XX:+CMSPermGenSweepingEnabled

Ekkor a CGC már képes kiüríteni a permanens tárba kerül osztályok használaton kívüli példányait, azonban maguk a betöltött osztályok is itt foglalnak helyet, s egy betöltött osztályt a VM alapvetően már nem takarít ki, akkor se, ha többé nem használja a VM alatt futó program. Ellenben meg tudjuk engedni ezt is a VM számára:

-XX:+CMSClassUnloadingEnabled

Ha az alapból kapott 64M kevés, akkor nagyobb PermGen helyet is tudunk kérni:

-XX:MaxPermSize=128m
      
      
Page viewed times

6 Comments

  1. A default GC-nek is kellene takaritania az osztalyokat amiknek a classloadere mar el lett dobva, szerintem...
    1. Auth Gábor AUTHOR

      Annyi mindent kellene... :)
    2. Auth Gábor AUTHOR

      Hmm... egyébként egy másik fórum szálban éppen ilyesmiről beszéltem, hogy lehetne segíteni a VM-nek és a GC-nek, hogy megmondhatnánk egypár módosítóval, hogy milyen élettartamot szánunk az adott dolognak. Nem tudom, hogy ez mennyit tudna segíteni a VM-nek, de érzésre előnyös lehet sok esetben.
    3. Unknown User (frimen)

      Na ezért gyűlőlőm én a GC-s megoldásokat. Hihetetlen, hogy lehet akkora ökör a SUN-nal, hogy igy valósítson meg egy GC-t. Bevallom eddgi nem nagyon értettem (igaz nem is mentem nagyon utána még), hogy miért zabálja a memóriát a java.. sok mindenre gondoltam, csak arra nem, hogy szar a default GC.

      1. Auth Gábor AUTHOR

        Nos, igen. A GC-t ideje lenne megreformálni... :)

        Volt már erről vitánk, de még mindig úgy gondolom, hogy lehetne segíteni a GC-nek némi kis annotációval, amely opcionálisan bevezethető lehetne a nyelvbe.

  2. Ha ez tényleg műxik akkor nagyon köszi ezt a tippet! De feltevődik bennem a kérdés, hogy mi ennek a buktatója? Mert, ha ilyen egyszerű a megoldás akkor miért nem ilyen paraméterekkel indul a Tomcat default? Vagy maga a JVM miért nem teszi ezt meg automatikusan? Miért kell ilyen praktikákkal noszogatni? Szóval kiváncsi volnék a hátulütőire is mert szerintem biztos vannak azok is!

    Mégegyszer nagyok köszi a tippet!
    --
    sirkalmi