Tomcat重启问题

时间:2013-12-18 18:36:55

标签: tomcat restart

我已经配置了Tomcat服务器自动重启,但我经常遇到以下错误:

Dec 10, 2013 5:30:32 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
**SEVERE**: The web application [/Xyz/Abc] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak.

这个例外不会让重启,因此我的应用程序就会停止。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为它不会阻止tomcat重启。您的关闭脚本并没有真正停止tomcat,它只是在tomcat服务器上打开一个端口(如果你没有更改server.xml中的默认值,则为8005),告诉它停止,然后退出。在退出之前,Tomcat可能仍需要一两秒才能清理。因此,如果在重新启动脚本中执行类似shutdown.sh; startup.sh的操作,则启动的tomcat可能希望绑定到上一个tomcat尚未发布的端口。在关机和启动之间设置sleep 5应解决此问题。

这是我最近在遇到同样问题时编写的代码:

instdir=/usr/lib
port=8443
$instdir/tomcat/bin/shutdown.sh

tries=0
while netstat -anf inet | grep '\*\.'$port > /dev/null
do
    tries=`expr $tries + 1`
    test $tries -ge 12 && break
    sleep 5
done

if test "$tries" -ge 12
then
    echo "Could not stop tomcat, port $port still in use"
    exit 1
fi
$instdir/tomcat/bin/startup.sh

答案 1 :(得分:0)

您需要修复原始问题,而不是尝试解决症状。运行您的Web应用程序并找出Timer-0正在做什么。这应该表明它被初始化的位置。找到那个地方并确保以下内容:

  1. 线程以daemon = true
  2. 启动
  3. 线程在ServletContextListener或类似的
  4. 中停止

    实际上,上面的#2应该在启动线程的同一个组件中完成(ServletContextInitializerServletContextListenerServlet等。)