"资源"是什么意思?在java? 为什么我们必须在使用后关闭它,即使垃圾收集器在jvm中运行? 为什么我们必须在finally块中编写资源清理代码?
答案 0 :(得分:10)
资源是具有有限安装的资源,例如数据库连接和文件描述符。 GC释放内存,但您仍然必须释放数据库连接,打开文件等资源,以允许其他线程使用它们。
顺便说一下,最好在完成资源使用后立即释放资源,而不仅仅是finalize
方法,这可能需要很长时间才能被GC调用。
答案 1 :(得分:7)
数据库连接,线程,文件句柄,套接字 - 都是有限的资源。
您运行的操作系统只允许这么多线程 - 每个线程1 MB开销。你受限于可用的RAM。文件句柄和套接字也一样。
数据库连接很有趣,因为它们涉及客户端和服务器。如果客户端gc是连接,是什么告诉服务器关闭连接?如果你无法在finally块中关闭,你很快就会发现你的数据库服务器在高负载下会耗尽连接。
Finalize不是正确的方法。不要依赖VM来调用它。编写close()
方法,并在方法完成资源后在finally
块中调用它。尽可能在最狭窄的范围内关闭。
答案 2 :(得分:5)
假设您有一个文件,您可以写入该文件而不关闭该资源,最终它将被GC关闭。问题是,当文件打开时,你无法在Windows中删除它,而在Linux中你可以删除它,但它不会释放任何空间。如果你想删除一个文件,你不想等到GC感觉就好像几小时后才能运行。
答案 3 :(得分:2)
java中“resource”一词的含义是什么?
典型的Java应用程序操纵几种类型的资源,例如文件,流,套接字和数据库连接。
为什么我们必须在finally块中编写资源清理代码?
Oracle article提供了对自动资源管理问题的Java 7答案。
必须小心处理这类资源,因为它们会为其操作获取系统资源。因此,您需要确保即使出现错误也可以释放。
确实,不正确的资源管理是生产应用程序中常见的失败原因,通常陷阱是数据库连接,并且在代码中的其他位置发生异常后,文件描述符仍保持打开状态。
这导致应用程序服务器在资源耗尽时经常重新启动,因为操作系统和服务器应用程序通常具有资源上限。