java中的资源是什么?为什么我们必须在使用后关闭它?

在java中“resource”这个词是什么意思? 为什么我们必须在使用后关闭它,即使垃圾收集器在jvm中运行? 为什么我们必须在finally块中编写资源清理代码?

资源是具有有限安装的资源,例如数据库连接和文件描述符。 GC释放内存,但您仍然必须释放数据库连接,打开文件等资源,以允许其他线程使用它们。

顺便说一下,最好在完成资源使用后立即释放资源,而不仅仅是在finalize方法中,这可能需要很长时间才能被GC调用。

数据库连接,线程,文件句柄,套接字 – 都是有限的资源。

您运行的操作系统只允许这么multithreading – 每个线程1 MB开销。 你受限于可用的RAM。 文件句柄和套接字也是如此。

数据库连接很有趣,因为它们涉及客户端和服务器 如果客户端gc是连接,是什么告诉服务器关闭连接? 如果您未能在finally块中关闭,您很快就会发现数据库服务器在高负载下将耗尽连接。

敲定不是正确的方法。 不要依赖VM来调用它。 编写close()方法,并在使用资源完成方法时在finally块中调用它。 尽可能在最窄的范围内关闭。

假设您有一个文件,您可以写入它而不关闭资源,最终它将被GC关闭。 问题是,当文件打开时,你无法在Windows中删除它,在Linux中你可以删除它,但它不会释放任何空间。 如果你想删除一个文件,你不想等到GC感觉就好像几小时后才能运行。

在java中“resource”这个词是什么意思?

典型的Java应用程序处理几种类型的资源,例如文件,流,套接字和数据库连接。

为什么我们必须在finally块中编写资源清理代码?

Oracle article介绍了Java 7对automatic resource management问题的回答。

  1. must be handled with great care这些资源,因为它们为其操作获取系统资源。 因此,您需要ensure that they get freed even in case of errors

  2. 实际上,不正确的资源管理是生产应用程序中常见的失败原因,通常的pitfalls being database connections和文件描述符在代码中的其他位置发生exception后仍保持打开状态。

  3. 这导致应用程序服务器在资源耗尽时经常重新启动,因为操作系统和服务器应用程序通常具有upper-bound limit for resources

使用Java 7 The try-with-resources Statement