Java tomcat 7.0和jax ws 2.2.5内存泄漏

Java tomcat 7.0和jax ws 2.2.5内存泄漏,java,tomcat,memory-leaks,jax-ws,Java,Tomcat,Memory Leaks,Jax Ws,我正在使用tomcat和jax ws构建ws。 当我停止应用程序时,通常在从eclipse重新部署时,我会收到以下消息: 25-mar-2012 16.21.16 com.sun.xml.ws.transport.http.servlet.WSServletDelegate destroy INFO: WSSERVLET15: JAX-WS servlet destroyed 25-mar-2012 16.21.16 com.sun.xml.ws.transport.http.servlet.W

我正在使用tomcat和jax ws构建ws。 当我停止应用程序时,通常在从eclipse重新部署时,我会收到以下消息:

25-mar-2012 16.21.16 com.sun.xml.ws.transport.http.servlet.WSServletDelegate destroy
INFO: WSSERVLET15: JAX-WS servlet destroyed
25-mar-2012 16.21.16 com.sun.xml.ws.transport.http.servlet.WSServletContextListener contextDestroyed
INFO: WSSERVLET13: JAX-WS context listener destroyed
25-mar-2012 16.21.16 org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
GRAVE: The web application [/xccm] created a ThreadLocal with key of type [com.sun.xml.ws.api.streaming.XMLStreamReaderFactory$Default$1] (value [com.sun.xml.ws.api.streaming.XMLStreamReaderFactory$Default$1@7edeaa13]) and a value of type [com.sun.xml.internal.stream.XMLInputFactoryImpl] (value [com.sun.xml.internal.stream.XMLInputFactoryImpl@4c700677]) 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. 
我发现
com.sun.xml.ws.api.streaming.XMLStreamReaderFactory$Default$1
jaxws-rt.jar
引用

但是,我没有在代码中明确使用任何jax ws类,除了:

import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.JAXBContext;
据我所知,tomcat加载
com.sun.xml.ws.transport.http.servlet.WSServlet
(以及日志片段中的其他类)

你知道如何解决这个问题吗

thx

您使用的库(JAX-WS实现)创建了一个本地线程,其密钥属于web应用程序类加载器加载的类型

这意味着不能对web app类加载器进行垃圾收集,因为只有在没有强引用其类的实例时,才能对类加载器进行垃圾收集。在多次重新部署之后,JVM将耗尽perm gen空间

真正的解决方法是监听web应用程序的生命周期,并在关闭时删除本地线程。但是,由于您不知道JAX-WS实现的内部结构,因此很难做到这一点


另一个解决方案是将jaxws-rt.jar(可能还有其他与JAX-WS相关的jar文件)添加到Tomcat安装的“lib”目录中。在这种情况下,它们将由公共类加载器加载,并且在重新部署web应用程序时不会重新加载。

是否可以在不修补库的情况下侦听jax ws生命周期?还有一件事:为什么线程类由不同的类加载器加载?非常感谢:)您将不得不听取servlet生命周期的意见,但深入了解JX-WS实现的内部并实现线程本地发布可能不是一件简单的事情。它不是由不同的类加载器加载的线程类,而是线程本地的类型类。我发现了一个问题,它描述了为什么将线程本地变量添加到JAX-WS运行时。希望Tomcat足够聪明,能够在处理了一定数量的请求后删除并重新创建线程。否则,PermGen是有保证的。您是否可以在调试中运行应用程序服务器,连接到它,将断点放在
ThreadLocal
类方法上并进行部署?你会明白原因的。