Tomcat和JAXB内存泄漏

问题描述:

我已经追了好几天了。
我们在我们的应用程序中使用JAXB,sun实现。当停止Tomcat(6或7)时,catalina日志文件中记录了严重的内存泄漏,列出了我们应用程序中的所有JAXB类,两个不同的包中有两个类。

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.

我经历过很多google和Stack溢出链接。我使用过JProfiler,它告诉我Tomcat在不使用它时会持有Enums,但这不应该是问题。 marshaller或unmarshaller的所有实例都是在本地创建的,并且对于激进的GC设置为null。我确保在销毁servlet时JAXBcontext为null,并且在我的contextDestroyed中运行System.gc();已建议避免错误。

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.

但仍记录错误。
我在Tomcat演示文稿中看到这是已知错误,因为JAXBContext.newInstance()创建了一个JarURLConnection锁,显然这可以通过禁用缓存来避免,但这对我没有任何作用。
http://people.apache.org/~ markt / presentations / 2010-11-04-Memory-Leaks-60mins.pdf

有关如何修复此内存泄漏的任何其他建议在Tomcat上运行的JAXB中。

这是错误日志:

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 


在回顾完所有不同的帖子后,我注意到将JAXB lib放入Tomcat的共享库中。所以我从我的应用程序WEB-INF / lib中删除了jaxb-impl-x.x.x.jar并将其放入[TomcatHome] / lib中。现在一切都很可爱。不确定这是最好的,因为现在在Tomcat下安装时需要有不同的方法。

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.