关闭资源总是很重要吗?

问题描述 投票:0回答:3

我多次遇到应用程序应始终显式关闭其打开的所有资源的说法。

我的编程方法相当务实,我不喜欢盲目遵循任何我没有清楚看到好处的约定。这就是我的问题。

我们假设:

  1. 我有一个小应用程序
  2. 它打开一些资源(例如文件、数据库连接、远程流)并对其进行处理
  3. 它运行几分钟然后退出
  4. 假设它是用 Java 编写的(如果语言相关)

我真的需要关心关闭我打开的所有资源吗?我想当应用程序/虚拟机退出时,我打开的所有资源都会被关闭/释放。我说得对吗?

如果这是真的,是否有任何令人信服的理由来关心在如此小的、短的工作应用程序中关闭资源?

更新:

这个问题纯粹是假设的,但不关心的论点是,我可能只是在编写一些快速脚本,并且不想编写任何与当前问题不直接相关的不必要的代码:关闭资源,做所有这些冗长的 try-catch-finally 事情,处理我不关心的异常等等。

问题的重点是不这样做是否会产生任何实际后果。

java file stream resources
3个回答
14
投票

我猜当应用程序/虚拟机退出时,我打开的所有资源都会被关闭/释放。

未定期释放的资源会发生什么情况,这是您无法控制的。它可能不会造成任何伤害,也可能会造成一些伤害。它还高度依赖于平台,因此仅在一个平台上进行测试是没有帮助的。

为什么我要关心在如此小的、运行时间较短的应用程序中关闭这些资源?

应用程序的大小并不重要。首先,应用程序通常会增长;其次,如果你不练习以正确的方式去做,那么在重要的时候你将不知道如何去做。


13
投票

如果不关闭资源,可能会导致应用服务器在资源耗尽时频繁重启,因为操作系统和服务器 应用程序通常对资源有上限

根据文档

典型的 Java 应用程序操作多种类型的资源,例如 文件、流、套接字和数据库连接。这些资源必须是 处理时要非常小心,因为它们会为其获取系统资源 操作。因此,您需要确保即使出现错误也能释放它们。

事实上,不正确的资源管理是失败的常见原因 生产应用程序,通常的陷阱是数据库连接 以及发生异常后保持打开状态的文件描述符 代码中的其他地方。这导致应用程序服务器频繁 当资源耗尽时重新启动,因为操作系统和服务器 应用程序通常对资源有上限。

try-with-resources Java 7 中为讨厌 close 语句的程序员引入的语句。


5
投票

简短的回答 - 是的。首先,这是一种可怕的编码实践,就像在生活的其他领域中不清理自己一样。另一方面,您无法预测操作系统是否会识别出 java 环境不再需要资源,并且您最终可能会锁定文件/等,而这些锁定在不强制重新启动的情况下无法释放。

始终清理您打开的所有资源!

关于您对原始问题的更新的更新 - 添加 try/catch 块需要 5 秒钟来关闭任何打开的资源,并且可以防止您花费 5 分钟重新启动计算机。正确地做事最终总是可以节省时间。我爸爸总是告诉我,真正的懒人第一次就把事情做好,这样他们就不必回来再做一次。我只是说不要偷懒,做正确的事。编写 catch 块所需的 5 秒永远不会显着减慢编写过程...通过不编写它而节省的 5 秒可能会极大地减慢您的调试速度。

© www.soinside.com 2019 - 2024. All rights reserved.