怎么正确的终止使用java -jar启动的java程序?

乐山ing 发布于 2017/02/24 17:52
阅读 2K+
收藏 0

就是类似Tomcat那样使用startup.bat启动,shutdown.bat关闭。

当然直接杀进程也可以,不过这样的话,感觉一些资源(线程池,数据库连接池)没办法释放

加载中
1
乌龟壳
乌龟壳

只要是正常杀的进程,线程、网络(数据库连接实际是网络)、打开的文件都会自动释放

1
咕泡学院
咕泡学院

资源到操作系统底层都是文件句柄,所以当你当前运行进程结束之后,当前进程所占用的句柄都会释放,对于网络的话也会单方断掉。

0
捏造的信仰
捏造的信仰
shutdown 向端口发送命令,进程收到命令后主动结束。
0
QiHaiYan
QiHaiYan

用kill,别用kill -9

0
Eric_张耀耀
Eric_张耀耀

杀掉进程就好了,kill

0
乐山ing
乐山ing

引用来自“乌龟壳”的评论

只要是正常杀的进程,线程、网络(数据库连接实际是网络)、打开的文件都会自动释放

linux下kill掉进程,为什么一定能保证资源释放。是不是还要加上一个

Runtime.getRuntime.addShutdownHook,在这里写上释放资源的代码。

如果是windows下,是不是通过taskmgr实现类似kill的功能

乐山ing
乐山ing
@花心Yy5109 回复@花心Yy5109 : 不知道区别,不过如果是tomcat,为什么不用tomcat本身的shutdown?
花心Yy5109
萌新想问问 kill和kill -9 的区别 我每次啥tomcat启动的java程序我都是kill -9 搞得 然后重启
乌龟壳
乌龟壳
这是操作系统的行为,无论什么语言跑在上面都是这样的。至于你提到的shutdown什么的,那是java程序内的生命周期逻辑,比如访问/api/shutdown页面后,你用程序主动把服务shutdown时才用的。和杀进程无关。不过里面还有一些细节比如程序可以监听杀进程信号,可以屏蔽杀进程信号之类的建议你去找资料研究。主要还是要分清层次,哪部分是操作系统的行为,哪部分是程序的行为
乌龟壳
乌龟壳
你问为什么,我只能和你说这不是什么科学道理,而是无论什么操作系统都会这么做的惯例,进程结束后释放所有相关资源,虽然有特例,但对于线程,打开的文件,建立的网络通信来说,无论lin还是win都会自动全部释放掉。但是不能用如kill -9这样的强杀,强杀就会绕过资源释放的过程。
返回顶部
顶部