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 |