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

Mut*_*esh 4 java garbage-collection

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

Era*_*ran 10

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

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


duf*_*ymo 7

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

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

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

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


Pet*_*rey 5

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


Bra*_*raj 2

java中“资源”一词的含义是什么?

典型的 Java 应用程序操作多种类型的资源,例如文件、流、套接字和数据库连接。

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

Oracle文章提出了 Java 7 对自动资源管理问题的答案。

  1. 必须小心处理此类资源,因为它们的操作需要系统资源。因此,您需要确保即使出现错误也能释放它们。

  2. 事实上,不正确的资源管理是生产应用程序中常见的故障来源,通常的陷阱是在代码中其他地方发生异常后数据库连接和文件描述符保持打开状态。

  3. 这就导致应用服务器在资源耗尽时频繁重启,因为操作系统和服务器应用程序对于资源一般都有上限。

使用Java 7 try-with-resources 语句