首页 > 代码库 > 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