如果我不关闭诸如频道、流和远程连接之类的东西,会发生什么情况?

What happens if I don't close things like channels, streams and remote connections?

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

让流、频道或连接保持打开状态的实际后果是什么?它会对远程机器产生负面影响吗?程序结束时所有流是否自动关闭?

在实践中总是有一些限制。连接是一种资源。资源有限。您的应用可能会在不格外小心的情况下耗尽全部或部分内容。

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

What is the actual consequence to leaving a stream, channel, or connection open?

你连接的系统仍在处理这个连接,即使你的进程没有使用它。这意味着额外的内存、cpu、套接字和可能的其他资源仍然被分配。

Does it affect the remote machine in a negative way?

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

Do all streams automatically close when the program ends?

这取决于你配合的系统。在你的情况下,我猜是的,但是在超时之后。

What is the actual consequence to leaving a stream, channel, or connection open?

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

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

Does it affect the remote machine in a negative way?

通常,与远程服务的任何类型的持久连接都会占用远程端的系统资源。当连接完全关闭时,这些资源通常会被释放。如果它 没有 完全关闭,那么这些资源可能会在不确定的时间内保持对连接的承诺;详细信息取决于所涉及服务的性质和配置。

Do all streams automatically close when the program ends?

低级意义上,是的。对于面向连接的网络流,这通常会导致远程端看到的网络层关闭。但是,如果 application-layer 闭包有任何相关意义,您就不能期望它会被执行。对远程系统可能产生的影响再次取决于所涉及服务的性质和配置。此外,如果您有待处理的缓冲输出,它可能不会在底层系统资源关闭之前写入。

总的来说,当你说

there's growing frustration about trying to close the channels/connections when using a try/catch/finally block

,我有点同情。该模式是一致的,并且相当容易理解和实施。您认为它很乏味——也许确实如此——并不代表您可以跳过适当的资源管理。大量的编程实践相当单调。优秀的程序员始终如一地很好地处理所有这些。这是工作的一部分。