Java Tomcat和JAXB内存泄漏

Java Tomcat和JAXB内存泄漏,java,tomcat,memory-leaks,jaxb,Java,Tomcat,Memory Leaks,Jaxb,我已经追了几天了。 我们在应用程序中使用JAXB,sun实现。停止Tomcat(6或7)时,catalina日志文件中记录了严重的内存泄漏,其中列出了应用程序中的所有JAXB类,两个不同包中的两个集 我已经通过了谷歌和堆栈溢出链接很多。我使用了JProfiler,它告诉我Tomcat在不使用枚举时会保留它们,但这不应该是问题所在。marshaller或unmarshaller的所有实例都是在本地创建的,并设置为null以用于攻击性GC。我确保在销毁servlet时JAXBcontext为null

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

我已经通过了谷歌和堆栈溢出链接很多。我使用了JProfiler,它告诉我Tomcat在不使用枚举时会保留它们,但这不应该是问题所在。marshaller或unmarshaller的所有实例都是在本地创建的,并设置为null以用于攻击性GC。我确保在销毁servlet时JAXBcontext为null,并且在我的contextdestrocted中运行System.gc();正如为避免错误而建议的那样

但仍然会记录错误。 我在Tomcat演示文稿中看到,这是一个已知错误,因为JAXBContext.newInstance()创建了一个JarURLConnection锁。显然,禁用缓存可以避免这一错误,但这对我没有任何帮助。

关于如何修复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库放入Tomcat的共享库中。因此,我从应用程序WEB-INF/lib中删除了jaxb-impl-x.x.x.jar,并将其放入[TomcatHome]/lib中。现在一切都很好。但不确定这是否是最好的,因为现在在Tomcat下安装时需要一种不同的方法。

我遇到了非常类似的问题。泄漏发生在jaxb上下文方法实现中:

StringWriter writer = new StringWriter(200);
JAXBContext context = JAXBContext.newInstance(objectClass);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(object, writer);
此代码在每个web服务请求上创建新实例


看,这对我来说不起作用。看不到移动的jar将如何工作,因为它们仍然以相同的方式加载…您好。如果jar驻留在应用程序作用域中,并且应用程序被重新部署,则每次部署应用程序时都会加载jar,但不会删除以前加载的类,因为它们包含弱引用。如果jar位于共享库中,则不会发生这种情况。只有在开发环境中,当您可能多次重新部署应用程序时,才可以使用此实例。将jar移动到系统Tomcat路径并不能修复
jaxb impl
中的错误。Buggy库仍然忘记清理线程局部变量。Tomcat检查代码仅在对象引用到web应用程序类加载器时发出警告,如果
$CATALINA_HOME/lib
引用中的
jaxb impl
导致系统类加载器。