linux下tomcat shutdown后 java进程依旧存在
今天遇到一个很奇怪的问题,如标题所示:
linux下(之所以强调linux下,是因为在windows下正常),执行tomcat ./shutdown.sh 后,虽然tomcat服务不能正常访问了,但是ps -ef | grep java 后,发现tomcat对应的java进程未随web容器关闭而销毁,进而存在僵尸java进程。
刚开始百思不得其解,google下,发现存在一种说法是:有非守护线程存在,jvm不会退出。进而确认是因为项目代码存在
scheduledExecutorService.scheduleAtFixedRate,众所周知,executorService会为之维护一个定时服务的线程池,该线程池并不会随着web容器关闭而销毁,不过有点让我很费解,尽管我已经在代码中addShutdownHook(shutdown()) ,但实际证明,这个hook只对Application.main时有效,在web容器中,hook会失效,所以并不会因为web容器关闭触发hook,进而能shutdown scheduledExecutorService。
知道原因后,处理其实很简单,在ContextLoaderListener#contextDestroyed 容器关闭时主动销毁scheduledExecutorService:
public void contextDestroyed(ServletContextEvent event) { //close ScheduledExecutorService in web container AccessTokenScheduled.shutdownScheduledExecutor(); SystemTimer.shutdownScheduledExecutor(); super.contextDestroyed(event); log.info("AppListener # context destroyed... "); }
参考:http://blog.sina.com.cn/s/blog_613904cc0101i5em.html
http://m.blog.csdn.net/blog/lin910429/25716113
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。