Here is more info on the problem and the current status: http://code.google.com/p/guava-libraries/issues/detail?id=92
Guys from guice copied the classes from guava (or google-collections), bringing the same problem to guice. The memory leaks manifests with hot redeploys in tomcat, after a couple of which you get a perm gen memory error. The only safe thing to do is to restart tomcat for every deploy. The problem is that for each web application, tomcat creates a class loader. When you redeploy the same application, tomcat creates a new class loader and removes the references it holds to the old class loader. But in some cases, there could be some reference from, for example, the system class loader to the old web app class loader, stopping the garbage collector from reclaiming the memory. A classic example is when you package the database driver in WEB-INF/lib in your webapp: the driver manager (in the system class loader) will hold a reference to a class in the webapp classloader. The same happens with shutdown hooks: you have a system class loader (Runtime) that holds a reference to the shutdown thread, keeping the webapp classloader always alive. Anyway, a shutdown hook will only cleanup resources when the jvm ends. And you probably want the cleanup to happen when the web application is undeployed. That is why I think the best option is to use a context loader listener: add a shutdown operation to DefaultGuiceModule and call it in from GuiceServletContextListener.contextDestroyed. BTW: I found another problem. XmlUtil is caching a DocumentBuilder in a ThreadLocal, and never released. This also keeps the web app classloader alive. Thanks On Thu, Sep 23, 2010 at 11:18 PM, Gagandeep singh <gagan.g...@gmail.com>wrote: > Hi Pablo > > I couldn't understand the memory leak you found in Guice. Hopefully crazy > bob will fix it soon (it has been 3 months already). > As for the shindig shutdown hook, it looks like an innocent hook which > tries > to stop the executor service which is where all the threads are scheduled. > Did you find any particular instance in which it creates a memory leak ? > Also, please explain a bit more on your ContextLoaderListener idea. > > Thanks > Gagan > > 2010/9/22 Pablo Graña <pablo.gr...@globant.com> > > > Hi guys. > > > > I get an oom after some hot deploys. I traced one problem to Guice ( > > http://www.mail-archive.com/google-gu...@googlegroups.com/msg02987.html- > > there is a workaround) and another to shindig: the DefaultGuiceModule > > installs a shutdown hook, apparently with the idea to shut down a thread > > pool. Is this hook correct? It should probably go in a > > ContextLoaderListener, right? > > > > thanks a lot. > > > > -- > > Pablo Gra\~na > > Chief Architect > > Globant > > Arg Office: +54 (11) 4109 1743 > > UK Office: +44 (20) 7043 8269 int 8043 > > US Office: +1 (212) 400 7686 int 8043 > > > -- Pablo Gra\~na Chief Architect Globant Arg Office: +54 (11) 4109 1743 UK Office: +44 (20) 7043 8269 int 8043 US Office: +1 (212) 400 7686 int 8043