JVM异常退出 - 清理系统资源

3

我有一个Java程序,其中有一个无限监听的服务器套接字。

如果JVM通过kill pid异常退出,系统资源和套接字对象会发生什么情况?套接字会被释放还是会被锁定?

在JVM异常退出的情况下,如何处理系统资源(如文件描述符/网络套接字/JDBC连接)的清理最佳方式?

我知道有finalizers和finally,但使用终结器存在一定的不确定性和性能下降。

请提供一些想法。

2个回答

4
在异常退出的情况下,显然JVM无法对其分配的任何内容进行特定的清理工作。这个责任将由操作系统本身负责。
对于套接字,现代操作系统肯定会释放任何由崩溃进程打开的套接字。文件和任何其他内核对象也是如此(JDBC连接是使用某种套接字实现的)。
如果JVM异常终止,将不会运行Finalizers。

有没有可能感知JVM崩溃并将控制权转移到代码中,以便我可以清理打开的套接字?当然,使用finalizer选项。 - user309281
请告诉我你所指的操作系统,它会在进程崩溃时处理自动关闭系统资源的事宜?我正在 HP-UX 11.2 上运行我的应用程序。 - user309281
1
@user309281:不,如果JVM崩溃了,那么在崩溃的进程中运行任何进一步的Java代码是不可能的。操作系统会为您清理。我预计HP-UX在这方面会很强大。 - Greg Hewgill
有关系统资源自动清理的任何指针/参考文档,请问是否有?我的观点是,例如,如果您将端口视为操作系统的资源...如果进程要确保该资源已锁定,则需要通过与操作系统交互来实现。现在,如果端口被锁定并且进程在释放锁之前死亡...我的问题是,操作系统是否会定期删除这些死锁,从而释放资源供其他进程使用... - user309281
@user309281:请参考以下类似情况的问题和答案:https://dev59.com/RkfRa4cB1Zd3GeqP7kau - Greg Hewgill
非常感谢。您的输入非常宝贵。 - user309281

1

当JVM退出时,系统资源例如内存、文件描述符和网络套接字会被释放。由于网络协议需要时间关闭与网络套接字的连接,因此连接到网络套接字将需要一段时间才能关闭。

一旦数据库意识到连接的另一端已关闭,JDBC连接应该被释放。保持活动状态的定时器可以更快地清理连接。数据库将清理打开的事务,并在清理连接时释放锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接