утечка памяти в Tomcat 7.0 и jax-ws 2.2.5 - PullRequest
3 голосов
/ 26 марта 2012

Я создаю ws с tomcat и jax-ws. когда я останавливаю свое приложение, обычно при повторном развертывании из затмения, я получаю это сообщение:

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. 

diggin с ClasspathHelper Я обнаружил, что на 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 (и другие классы в фрагменте журнала).

есть идеи, как решить эту проблему?

ТНХ

1 Ответ

3 голосов
/ 26 марта 2012

Используемая вами библиотека (реализация JAX-WS) создала локальный поток, ключ которого имеет тип, который был загружен загрузчиком классов вашего веб-приложения.

Это означает, что загрузчик классов веб-приложения не может быть сборщиком мусора, потому что загрузчик классов может быть сборщиком мусора, только если на экземпляры его классов строго не ссылаются. После нескольких повторных развертываний у вашей JVM не останется свободного места.

Реальным решением было бы прослушать жизненный цикл вашего веб-приложения и удалить локальный поток при его завершении. Однако, поскольку вы не знаете внутреннюю часть реализации JAX-WS, вам будет трудно это сделать.

Другим решением было бы добавить jaxws-rt.jar (и, возможно, другие файлы JAR, связанные с JAX-WS) в каталог "lib" вашей установки Tomcat. В этом случае они будут загружены общим загрузчиком классов и не будут перезагружены при повторном развертывании веб-приложения.

...