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