在应用程序关闭时是否必须显式关闭SocketChannel?

时间:2018-09-12 09:45:23

标签: java socketchannel

假设我们有一个已打开的SocketChannel。在终止应用程序之前显式关闭它是否重要?换句话说,如果我们不这样做,留下未封闭的系统资源会有任何风险吗?

2 个答案:

答案 0 :(得分:3)

假设您的操作系统是现代的多用户操作系统,那么不关闭通道,接口,文件描述符而退出进程不会导致资源无法关闭的风险。进程退出时,操作系统会适当地处理用户空间进程拥有的所有资源(即,如有必要,将其关闭 1 )。

这适用于用户进程是运行Java应用程序的JVM以及任何其他类型的用户进程。


1-它比“一切都关闭”要复杂一些。例如,在UNIX / Linux中,子进程可以从其父进程继承打开的“文件”句柄,因此可以想象两个或多个用户进程可以共享一个网络套接字。操作系统将使用引用计数来处理这种情况。

答案 1 :(得分:1)

当您的进程终止时,套接字将自动关闭,并且所有进程的资源都将被释放。

但是,如果这是一个TCP套接字,那么通常不会在发生这种情况时通知另一端。就像有人拔掉网络电缆一样。

如果要在同一台计算机上的进程之间进行通信,则可能要改用管道,当您的一端自动关闭时,它们会向另一端提供可靠的通知。

如果您想产生一个进程并在父进程关闭时使其死亡,我建议为此使用一个未命名的管道到子进程stdin。这是最简单的事情,而且非常可靠。