Tomcat停止时无法正常关闭?

Tomcat停止时无法正常关闭?

Tomcat停止时无法正常关闭?

背景

在调tomcat的shutdown命令,或者在编辑器里点关闭web服务,可能会出现关不掉的情况,控制台可能也不报错,表现就是卡住了,那应该如何排查tomcat无法正常shudown的情况?

为什么tomcat不能正常关闭?

文末的参考文档说的很详细了,我这里再总结下:不是tomcat关不掉,而是tomcat启动的应用某些线程没正常关闭, 再明确点就是:项目中有非daemon的线程没关闭。具体原因大家再百度百度吧。

解决方案

知道了什么原因,解决方案就很简单了:关闭命令调用后,看还有哪些非daemon线程还活着,然后下面二选一:

  • 把这个线程关闭,如果是属于线程池的线程,则关闭线程池
  • 更暴力点,把这个线程的daemon属性设为true。如果是关键业务,则最好是使用正常的线程关闭

应该怎么排查?

一旦调用了命令,断点的线程都被释放了,那怎么排查哪些非daemon还活着? 答案是arthas工具,虽然调用了tomcat的shutdown的命令,但jvm还存活着,此时arthas依然可以连接上,然后调用thread命令即可查看当前所有存活的线程。

所以一个很好的开发习惯是:业务中创建的线程都必须自定义名字,包括走线程池创建的线程。 Tomcat停止时无法正常关闭 然后,基于线程名字到对应业务中进行上面所说的二选一操作。处理完成,web即可正常关闭。

参考文档

https://blog.csdn.net/u012454773/article/details/54584874

--- END ---

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: /archives/tomcatshutdown


100%