Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tomcat and JAXB memory leaks

I have been chasing this for a few days now. We use JAXB, sun implementation, in our app. When stopping Tomcat (6 or 7) there is a severe memory leak logged in the catalina log file listing all the JAXB classes that we have in our application, two sets in two different packages.

I have been through a lot of google and Stack overflow links. I have used JProfiler which shows me that Tomcat is holding onto Enums when they are not used but this should not be the issue. All instances of marshaller or unmarshaller are created locally and set to null for aggressive GC. I ensure that JAXBcontext is null when servlets are destroyed and also in my contextDestroyed I run a System.gc(); as has been suggested to avoid the error.

But still the error is logged. I have seen in a Tomcat presentation that this is known error because a JarURLConnection lock is created by JAXBContext.newInstance() apparently this can be avoided by disabling caching, but this did nothing for me. http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf

Any other suggestions as to how to fix this memory leak in JAXB running on Tomcat.

This is the error log:

SEVERE: The web application [/myApplication] created a ThreadLocal with key of type [com.sun.xml.bind.v2.ClassFactory$1] (value [com.sun.xml.bind.v2.ClassFactory$1@6a724da1]) and a value of type [java.util.WeakHashMap] (value [{class my.package.model.layout.Element=java.lang.ref.WeakReference@7646bb9f, class my.package.model.layout.ScriptBeforeFileID=java.lang.ref.WeakReference@1dc80063, class my.package.model.layout.OutputProperty=java.lang.ref.WeakReference@359172db, class my.package.model.layout.Data=java.lang.ref.WeakReference@600ba356, class my.package.model.layout.InputProperty=java.lang.ref.WeakReference@1c10945d, class my.package.model.layout.ToPort=java.lang.ref.WeakReference@47c7410, class my.package.model.layout.ConfigFile=java.lang.ref.WeakReference@6a7c8bd, class my.package.model.layout.LayoutInstanceID=java.lang.ref.WeakReference@716bf3b4, class my.package.model.layout.ScriptAfterFunction=java.lang.ref.WeakReference@664ce898, class be.securit.trustbuilder.config.model.........}]) 
    but failed to remove it when the web application was stopped. 
Threads are going to be renewed over time to try and avoid a probable memory leak.
        17-sep-2013 15:21:45 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks 
like image 262
Gurnard Avatar asked Sep 17 '13 13:09

Gurnard


1 Answers

After going back through all the different posts I noticed mention of placing JAXB lib into the shared lib of Tomcat. So I removed the jaxb-impl-x.x.x.jar from my applications WEB-INF/lib and placed it into [TomcatHome]/lib. Now it all works lovely. Not sure this is the best though because now there needs to be a different method when installing under Tomcat.

like image 118
Gurnard Avatar answered Sep 22 '22 12:09

Gurnard