Java 如果我不';不要关闭通道、流和远程连接之类的东西?

Java 如果我不';不要关闭通道、流和远程连接之类的东西?,java,stream,connection,channel,Java,Stream,Connection,Channel,我正在开发一个使用JSch连接到远程unix服务器的程序。我还使用jdbc连接到一个配置单元数据库,使用Apache Hadoop HDFS API连接到一个分布式文件系统。当我看到close()方法可用时,我会随意地将它们包括在内,但是当使用try/catch/finally块时,尝试关闭通道/连接会让我越来越沮丧 让流、通道或连接保持打开状态的实际后果是什么?它是否会对远程机器产生负面影响?程序结束时,所有流是否自动关闭?实际上,总是有一些限制。连接是一种资源。资源有限。你的应用程序可能会耗

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


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

实际上,总是有一些限制。连接是一种资源。资源有限。你的应用程序可能会耗尽所有或部分资源,而无需额外小心

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

让流、通道或连接保持打开状态的实际后果是什么

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

它是否会对远程机器产生负面影响

对。例如,远程计算机可以拒绝下一个连接,也可以减慢速度

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

这取决于你们合作的制度。如果是你的话,我会同意的,但要过一段时间

让流、通道或连接保持打开状态的实际后果是什么

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

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

它是否会对远程机器产生负面影响

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

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

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

但总的来说,当你说

当使用try/catch/finally块时,尝试关闭通道/连接的挫折感越来越大


,我没有什么同情心。该模式是一致的,并且相当容易理解和实现。您认为它很乏味——也许确实如此——这并不能让您获得跳过正确管理资源的许可。编程的大量实践相当单调。优秀的程序员能够始终如一地很好地处理所有这些问题。这是工作的一部分。

您有内存泄漏我习惯于在本地发生内存泄漏,我知道在进程终止时它们会得到解决。远程连接也是这样吗?我担心对远程主机可能造成的影响。请注意,为了消除try/catch/finally块的挫折感,只需创建一个具有静态方法的helper类
public static void close(Closeable c)
,如果您厌倦了每次编写try-catch-finally,就可以在其中执行try-catch-finally。我认为@JohnBollinger是对的,程序员必须一直处理它,这是一个很好的实践。@john感谢您的反馈!我将深入研究一些关于Hadoop如何通过JavaAPI处理连接的文档。至于正确管理资源:我不是一个好的程序员,所以我不知道管理异常和资源的最佳实践。我的许多同事也没有,因此我需要能够向他们传递信息,帮助他们理解在涉及到我们的生产软件时需要进行适当的资源管理。@jitterbugchuw,如果你正在编写程序,那么你至少应该立志成为一名优秀的程序员。带回家的信息应该是这样的:当你使用完可关闭的资源后,继续确保关闭它们,即使这样做很乏味。@JohnBollinger我绝对会的,谢谢你帮助我更好地理解这一点