我已经追了几天了。我们在应用程序中使用JAXB(sun实现)。停止Tomcat(6或7)时,在catalina日志文件中记录了严重的内存泄漏,其中列出了我们应用程序中拥有的所有JAXB类,两个不同软件包中的两个集合。
我已经通过很多谷歌和堆栈溢出链接。我使用了JProfiler,它向我显示了Tomcat在不使用Enums时保持不变,但这不应该成为问题。marshaller或unmarshaller的所有实例均在本地创建,并且对于积极的GC设置为null。当销毁servlet时,我确保JAXBcontext为空;在我的上下文中,我也运行了System.gc();如已建议避免该错误。
但是仍然记录错误。我在Tomcat演示文稿中看到这是已知的错误,因为JarURLConnection锁是由JAXBContext.newInstance()创建的,显然可以通过禁用缓存来避免,但这对我没有任何帮助。 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-xxxjar,并将其放入[TomcatHome] / lib中。现在一切正常。不确定这是否是最好的方法,因为在Tomcat下安装时需要使用其他方法。