I'm developing on the standard Lift platform (maven and jetty). I'm repeatedly (once every couple of days) getting this:
Exception in thread "7048009@qtp-3179125-12" java.lang.OutOfMemoryError: PermGen space
2009-09-15 19:41:38.629::WARN: handle failed
java.lang.OutOfMemoryError: PermGen space
This is in my dev environment. It's not a problem because I can keep restarting the server. In deployment I'm not having these problems so it's not a real issue. I'm just curious.
I don't know too much about the JVM. I think I'm correct in thinking that permanent generation memory is for things like classes and interned strings? What I remember is a bit mixed up with the .NET memory model...
Any reason why this is happening? Are the defaults just crazily low? Is it to do with all the auxiliary objects that Scala has to create for Function objects and similar FP things? Every time I restart Jetty with newly written code (every few minutes) I imagine it re-loads classes etc. But even so, it cant' be that many can it? And shouldn't the JVM be able to deal with a large number of classes?
Cheers
Joe
From this post:
-XX:+CMSClassUnloadingEnabled
: this setting enables garbage collection in the permgenspace-XX:+CMSPermGenSweepingEnabled
: allows the garbage collector to remove even classes from the memory-XX:PermSize=64M -XX:MaxPermSize=128M
: raises the amount of memory allocated to the permgenspaceMay be this could help.
Edit July 2012 (almost 3 years later):
Ondra Žižka comments (and I have updated the answer above):
CMSClassUnloadingEnabled
(Whether class unloading enabled when using CMS GC)CMSPermGenSweepingEnabled
in the futureSee the full Hotspot JVM Options - The complete reference for mroe.