【问题标题】:tomcat 7.0 and jax-ws 2.2.5 memory leaktomcat 7.0 和 jax-ws 2.2.5 内存泄漏
【发布时间】:2012-04-09 12:51:07
【问题描述】:

我正在用 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. 

使用 ClasspathHelper 进行挖掘,我发现 com.sun.xml.ws.api.streaming.XMLStreamReaderFactory$Default$1jaxws-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(以及 log sn-p 中的其他类)。

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

谢谢

【问题讨论】:

  • 你能在调试中运行你的应用服务器,连接到它,在ThreadLocal类方法上设置断点并进行部署吗?你会发现原因。

标签: java tomcat memory-leaks jax-ws


【解决方案1】:

您使用的库(JAX-WS 实现)创建了一个本地线程,其键的类型已由您的 Web 应用类加载器加载。

这意味着 Web 应用程序类加载器不能被垃圾收集,因为类加载器只有在没有其类的实例被强引用时才能被垃圾收集。多次重新部署后,您的 JVM 将耗尽 perm gen 空间。

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

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

【讨论】:

  • 是否可以在不修补库的情况下监听 jax-ws 生命周期?
  • 还有一件事:为什么线程类由不同的类加载器加载?非常感谢:)
  • 您将不得不听听 servlet 生命周期,但深入了解 JX-WS 实现的内部并实现线程本地的释放可能并不直接。它不是由不同的类加载器加载的线程类,它是线程本地的类型类。
  • 我发现了问题JAX_WS-555,它描述了为什么将线程本地变量添加到 JAX-WS 运行时。希望 Tomcat 足够聪明,可以在处理了一定数量的请求后删除并重新创建一个线程。否则 PermGen 是有保证的。
猜你喜欢
  • 2012-02-09
  • 2013-09-21
  • 2014-12-25
  • 2015-12-27
  • 1970-01-01
  • 2012-03-19
  • 2012-08-20
  • 2012-08-06
  • 2013-07-29
相关资源
最近更新 更多