首页 > 代码库 > linux下tomcat shutdown后 java进程依旧存在
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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。