如果我不关闭频道,流和远程连接等事情,会发生什么?

时间:2016-09-21 14:30:22

标签: java stream connection channel

我正在使用JSch连接到远程unix服务器的程序。我还使用jdbc和带有Apache Hadoop HDFS API的分布式文件系统连接到Hive数据库。当我看到它们可用时,我一直随便包括close()方法,但是当使用try / catch / finally块时尝试关闭通道/连接时会越来越沮丧。

保持流,频道或连接打开的实际后果是什么?它是否会以负面方式影响远程机器?程序结束时是否会自动关闭所有流?

2 个答案:

答案 0 :(得分:4)

  

让流,频道或连接保持打开的实际后果是什么?

至少它会消耗资源,直到这些端点关闭,如果它们应该被垃圾收集,可能会也可能不会发生。这可能构成资源泄漏。在极端情况下,程序可能耗尽可用资源(例如同时打开文件的数量)。

此外,对于输出,您写入此类接收器的数据可能在内部保持缓冲,而不是实际被推送到预期目的地。

  

是否以负面方式影响远程机器?

通常,与远程服务的任何类型的持久连接都会使远程端的系统资源占用。当连接完全关闭时,通常会释放这些资源。如果干净地关闭,那么这些资源可能会在不确定的时间内继续提交给连接;细节取决于所涉及服务的性质和配置。

  

程序结束时是否会自动关闭所有流?

从低层次来看,是的。对于面向连接的网络流,这通常会导致远程端将看到的网络层关闭。但是,如果存在应用程序层闭包的任何相关含义,则不能指望执行该操作。可能对远程系统产生的影响还取决于所涉及服务的性质和配置。此外,如果缓冲输出挂起,则可能在关闭基础系统资源之前不会写入。

但总的来说,当你说

  

在使用try / catch / finally块时尝试关闭通道/连接越来越令人沮丧

,我没有同情心。该模式是一致的,并且相当容易理解和实现。你觉得它很乏味 - 也许就是这样 - 并没有给你许可来跳过正确的资源管理。大量的编程实践相当单调。优秀的程序员始终如一地处理所有这些。这是工作的一部分。

答案 1 :(得分:0)

在实践中,有一些限制。连接是一种资源。资源有限。你的应用程序可能会耗尽其中的全部或部分内容。

假设您从应用程序连接到serverX。 ServerX只能处理10个连接。如果您在第11次忘记关闭10次与serverX的连接,则可能无法连接。这当然是简化,但它描述了不关闭连接的问题的本质。

  

让流,频道或连接保持打开的实际后果是什么?

您连接的系统仍在处理此连接,即使您的进程未使用它也是如此。这意味着仍然会分配额外的memmory,cpu,套接字和可能的其他资源。

  

是否以负面方式影响远程机器?

是。例如,远程机器可以拒绝下一次连接或减慢速度。

  

程序结束时是否会自动关闭所有流?

这取决于你合作的系统。在你的情况下,我会说是的,但是在一些超时之后。