PermGen OutOfMemory error

158 views
Skip to first unread message

Rob

unread,
Jun 11, 2009, 12:38:11 PM6/11/09
to Clojure
Hi all,

I'm using Clojure for web apps inside Tomcat. If I don't compile
my .clj files ahead of time, I will eventually get one of these
OutOfMemory errors, after a number of redeployments. Is there
something I can do about this? Is this a bug somewhere, in my code,
or in Clojure, or in Tomcat; or a limitation of the JVM?

thanks,
Rob

Here is the entire barfage from my Tomcat log:

Jun 11, 2009 12:01:57 PM org.apache.catalina.core.StandardWrapperValve
invoke
SEVERE: Servlet.service() for servlet ClojureServlet threw exception
java.lang.NullPointerException
at clojure.lang.Var.popThreadBindings(Var.java:289)
at biz.encodia.webapps.webdispatch
$make_dispatcher__3759$fn__3761.invoke(webdispatch.clj:90)
at clojure.lang.Var.invoke(Var.java:350)
at biz.encodia.webapps.ClojureServlet.processRequest
(ClojureServlet.java:70)
at biz.encodia.webapps.ClojureServlet.doGet
(ClojureServlet.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
717)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter
(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter
(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke
(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke
(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process
(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run
(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)
Jun 11, 2009 12:04:23 PM org.apache.catalina.core.ApplicationContext
log
SEVERE: StandardWrapper.Throwable
java.lang.ExceptionInInitializerError
at biz.encodia.webapps.ClojureServlet.loadDispatchCode
(ClojureServlet.java:32)
at biz.encodia.webapps.ClojureServlet.init(ClojureServlet.java:
49)
at org.apache.catalina.core.StandardWrapper.loadServlet
(StandardWrapper.java:1172)
at org.apache.catalina.core.StandardWrapper.allocate
(StandardWrapper.java:808)
at org.apache.catalina.core.StandardWrapperValve.invoke
(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke
(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process
(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run
(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)
Caused by: java.lang.RuntimeException: java.lang.OutOfMemoryError:
PermGen space (core.clj:2151)
at clojure.lang.RT.<clinit>(RT.java:294)
... 15 more
Caused by: java.lang.OutOfMemoryError: PermGen space (core.clj:2151)
at clojure.lang.Compiler.eval(Compiler.java:4617)
at clojure.lang.Compiler.eval(Compiler.java:4593)
at clojure.lang.Compiler.load(Compiler.java:4931)
at clojure.lang.RT.loadResourceScript(RT.java:329)
at clojure.lang.RT.loadResourceScript(RT.java:320)
at clojure.lang.RT.load(RT.java:398)
at clojure.lang.RT.load(RT.java:370)
at clojure.lang.RT.doInit(RT.java:405)
at clojure.lang.RT.<clinit>(RT.java:291)
... 15 more
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.lang.ClassLoader.defineClass(ClassLoader.java:520)
at clojure.lang.DynamicClassLoader.defineClass
(DynamicClassLoader.java:42)
at clojure.lang.Compiler$FnExpr.getCompiledClass(Compiler.java:
3465)
at clojure.lang.Compiler$FnExpr.eval(Compiler.java:3476)
at clojure.lang.Compiler.eval(Compiler.java:4600)
... 23 more
Jun 11, 2009 12:04:23 PM org.apache.catalina.core.StandardWrapperValve
invoke
SEVERE: Allocate exception for servlet ClojureServlet
java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
at java.lang.ClassLoader.defineClass(ClassLoader.java:520)
at clojure.lang.DynamicClassLoader.defineClass
(DynamicClassLoader.java:42)
at clojure.lang.Compiler$FnExpr.getCompiledClass(Compiler.java:
3465)
at clojure.lang.Compiler$FnExpr.eval(Compiler.java:3476)
at clojure.lang.Compiler.eval(Compiler.java:4600)
at clojure.lang.Compiler.eval(Compiler.java:4593)
at clojure.lang.Compiler.load(Compiler.java:4931)
at clojure.lang.RT.loadResourceScript(RT.java:329)
at clojure.lang.RT.loadResourceScript(RT.java:320)
at clojure.lang.RT.load(RT.java:398)
at clojure.lang.RT.load(RT.java:370)
at clojure.lang.RT.doInit(RT.java:405)
at clojure.lang.RT.<clinit>(RT.java:291)
at biz.encodia.webapps.ClojureServlet.loadDispatchCode
(ClojureServlet.java:32)
at biz.encodia.webapps.ClojureServlet.init(ClojureServlet.java:
49)
at org.apache.catalina.core.StandardWrapper.loadServlet
(StandardWrapper.java:1172)
at org.apache.catalina.core.StandardWrapper.allocate
(StandardWrapper.java:808)
at org.apache.catalina.core.StandardWrapperValve.invoke
(StandardWrapperValve.java:129)
at org.apache.catalina.core.StandardContextValve.invoke
(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke
(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke
(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke
(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke
(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service
(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process
(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run
(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:613)

hughw

unread,
Jun 11, 2009, 2:23:02 PM6/11/09
to Clojure


On Jun 11, 11:38 am, Rob <rob.nikan...@gmail.com> wrote:
> Hi all,
>
> I'm using Clojure for web apps inside Tomcat.  If I don't compile
> my .clj files ahead of time, I will eventually get one of these
> OutOfMemory errors, after a number of redeployments.  Is there
> something I can do about this?  Is this a bug somewhere, in my code,
> or in Clojure, or in Tomcat; or a limitation of the JVM?
>

PermGen space is where Sun's VM keeps class bytes. It's not garbage
collected, so if you keep adding classes to a running VM you will
eventally run out. We can only deploy a couple of times on our non-
clojure webapp, in Jboss + Tomcat. It's not unique to Clojure, but
it's true that generating classes on the fly can burn up permGen space
faster. Try increasng your PermGen space as a workaround. This arg
your jvm:
-XX:MaxPermGen=128m or so might help.


Hugh

Allen Rohner

unread,
Jun 11, 2009, 6:44:35 PM6/11/09
to Clojure
I haven't hit the permgen issue, but it sounds like I have a similar
setup to you. Out of curiosity, how do you redeploy while compiling
your .clj files? I typically connect via Slime and use slime-load-
file, which I assume calls (load filename)

Allen

Rob

unread,
Jun 12, 2009, 12:53:30 PM6/12/09
to Clojure


On Jun 11, 6:44 pm, Allen Rohner <aroh...@gmail.com> wrote:
> I haven't hit the permgen issue, but it sounds like I have a similar
> setup to you. Out of curiosity, how do you redeploy while compiling
> your .clj files? I typically connect via Slime and use slime-load-
> file, which I assume calls (load filename)

I'm experimenting with both Eclipse and Netbeans, and in both cases I
have two Tomcats -- a local one, controlled by the IDE, and a live
one. During development the IDE keeps deploying to the local Tomcat
when I edit files, or when I run a "Publish" or "Run" command. It
copies .clj files into the classpath and they then get compiled at
runtime. When I deploy to the live server, I have an Ant target that
compiles the clj files to class files, packages them with everything
else in the WAR file, and copies the WAR to the server.

Rob
Reply all
Reply to author
Forward
0 new messages