我已经追了几天了。我们在我们的应用程序中使用 JAXB,即 sun 实现。当停止 Tomcat(6 或 7)时,catalina 日志文件中记录了严重的内存泄漏,列出了我们在应用程序中拥有的所有 JAXB 类,两个集合在两个不同的包中。
我经历了很多谷歌和堆栈溢出链接。我使用了 JProfiler,它告诉我 Tomcat 在不使用 Enum 时会保留它们,但这不应该是问题。marshaller 或 unmarshaller 的所有实例都是在本地创建并设置为 null 以进行积极的 GC。我确保当 servlet 被销毁时 JAXBcontext 为空,并且在我的 contextDestroyed 中我运行 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