Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不要穿袜子';必须在应用程序关闭时显式关闭?_Java_Socketchannel - Fatal编程技术网

Java 不要穿袜子';必须在应用程序关闭时显式关闭?

Java 不要穿袜子';必须在应用程序关闭时显式关闭?,java,socketchannel,Java,Socketchannel,假设我们有一个打开的SocketChannel。在终止应用程序之前显式关闭它是否重要?换言之,如果我们不这样做,是否存在未关闭系统资源的风险?假设您的操作系统是现代多用户操作系统,则在不关闭通道、摘要、文件描述符的情况下退出进程不会导致资源未关闭的风险。用户空间进程拥有的所有资源在进程退出时由操作系统进行适当处理(如有必要,关闭1) 这适用于用户进程是运行Java应用程序的JVM时,以及任何其他类型的用户进程 1-这比“一切都结束了”要复杂一点。例如,在UNIX/Linux中,子进程可以从其父

假设我们有一个打开的
SocketChannel
。在终止应用程序之前显式关闭它是否重要?换言之,如果我们不这样做,是否存在未关闭系统资源的风险?

假设您的操作系统是现代多用户操作系统,则在不关闭通道、摘要、文件描述符的情况下退出进程不会导致资源未关闭的风险。用户空间进程拥有的所有资源在进程退出时由操作系统进行适当处理(如有必要,关闭1)

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



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

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

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

如果您在同一台计算机上的进程之间通信,那么您可能希望改用管道,当您的端自动关闭时,管道会向另一端提供可靠的通知


如果您希望生成一个进程,并在父进程崩溃时使其死亡,我建议使用一个未命名的管道来连接子进程stdin。这是最简单的事情,而且非常可靠。

当您调用
close
时,它也会关闭
套接字
,我认为这是您可能想要的东西。您可能不会造成资源泄漏,因为JVM破坏将释放套接字。但另一方面,结果可能会有所不同,例如流中断与流关闭。TCP至少会在运行JavaSE的操作系统上通知对等方:如果包括JVM在内的任何进程刚刚退出,Unix会发送FIN(如
shutdown()
),除非您设置了Linger,否则它会发送RST;Windows发送RST。对于智能卡或类似的东西,可能不是。对于突然终止的进程,特别是在Windows上,我的经验不是这样的。你有裁判吗?我还是不太相信,但它可以帮助OP做出决定:-)我很确定我在这方面见过一些Unix规范,但很久以前,我现在找不到任何方便的规范;我甚至不认为我曾经寻找过MS规范,只是注意到它是不同的,并认为“和往常一样”。但多年来,我已经执行了数千次这个案例,有些是有意的(测试错误处理逻辑),有些是无意的(由于bug和其他代码或脚手架看到它而导致死亡)。虽然不是在W10上(我拒绝),但可以想象,这可能会有所不同。请随时获取tcpdump或wireshark或任何适用的工具并尝试。