tomcat部署应用后就无法使用shutdown关闭JVM,每次都要Kill进程让人很不爽,为什么会这样呢?
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
容器只按照Java EE规范来管理应用中标准组件的生命周期,但你自己创建出来的资源要自己负责处理,容器是不会替你管理的。当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出.
那么我们如何确定当前的JVM虚拟机中的,当前的用户线程和daemon有多少呢?
我们可以用JDK中自带的查看堆栈工具jstack.
jstack 6088
找到问题的根源后,我们可以这样处理:
1.将应用自己创建的线程、timer、scheduler这类的资源设为守护线程(daemon)。setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。
2.自己管理非守护线程的生命周期,当容器停止时手工释放资源。比如你可以在 Servlet 或 ServletContextListener 的 init 方法中初始化资源,在 destroy 方法中释放资源。