1

我一直在寻找很多,但没有找到一个可以帮助我解决这个问题的完美的。我有 Web 服务,并且正在使用 JAX-WS 生成存根。为了访问 Web 服务的方法,我编写了一个类,其中所有方法都是静态的,例如

public static String getLocation()
{
 //call to the web service
}

我指定静态是因为我想确认这不是我的问题的根本原因。现在,当我检查 Tomcat 目录中的日志时,catilina 日志显示了一些类似这样的内容...当我启动或关闭 tomcat 服务器时会发生此错误

Mar 18, 2010 11:13:07 PM org.apache.catalina.core.ApplicationContext log
INFO: HTMLManager: stop: Stopping web application at '/testWeb'
Mar 18, 2010 11:13:07 PM org.apache.catalina.loader.WebappClassLoader    clearReferencesThreads
SEVERE: A web application appears to have started a thread named [leakingThread]  but  has failed to stop it. This is very likely to create a memory leak.

我看到的另一个错误是

SEVERE: Unable to determine string representation of value of type      [com.sun.xml.stream.writers.XMLStreamWriterImpl]
java.lang.UnsupportedOperationException
at com.sun.xml.stream.writers.XMLStreamWriterImpl.entrySet (XMLStreamWriterImpl.java:2134)
at java.util.AbstractMap.toString(AbstractMap.java:478)
at org.apache.catalina.loader.WebappClassLoader.clearThreadLocalMap(WebappClassLoader.java:2433)
at org.apache.catalina.loader.WebappClassLoader.clearReferencesThreadLocals(WebappClassLoader.java:2349)
at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1921)
at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1833)
at org.apache.catalina.loader.WebappLoader.stop(WebappLoader.java:740)
at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4920)
at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:936)

请任何人帮助我清除这些错误。提前致谢。

4

1 回答 1

1

我的诊断:您Map在本地线程中有一个实现,并且此映射不支持由entrySet触发的操作Map#toString。准确地说,您的异常com.sun.xml.internal.stream.writers.XMLStreamWriterImpl.

不幸的是,Tomcat 清除本地线程的代码被编写为无条件地调用toString对象,只是为了能够在调试级别为 on时记录它们。

如果您无法摆脱为此使用线程本地,则解决此问题可能会遇到一些麻烦。

顺便说一句,您的线程泄漏很可能是由于上述错误导致清理失败的结果。

于 2013-05-16T11:09:32.547 回答