java中的资源是什么?为什么在使用后必须关闭它?
java中“资源”一词的含义是什么? 为什么即使垃圾收集器在jvm中运行,在使用后也必须关闭它? 为什么我们必须在finally块中编写资源清理代码 java中“资源”一词的含义是什么 典型的Java应用程序处理几种类型的资源,如文件、流、套接字和数据库连接 为什么我们必须在finally块中编写资源清理代码 提供了Java 7对自动资源管理问题的答案java中的资源是什么?为什么在使用后必须关闭它?,java,garbage-collection,Java,Garbage Collection,java中“资源”一词的含义是什么? 为什么即使垃圾收集器在jvm中运行,在使用后也必须关闭它? 为什么我们必须在finally块中编写资源清理代码 java中“资源”一词的含义是什么 典型的Java应用程序处理几种类型的资源,如文件、流、套接字和数据库连接 为什么我们必须在finally块中编写资源清理代码 提供了Java 7对自动资源管理问题的答案 必须非常小心地处理此类资源,因为它们为其操作获取系统资源。因此,您需要确保即使在出现错误的情况下也能释放它们 事实上,不正确的资源管理是生产应用
使用资源是指具有有限数量的资源,例如数据库连接和文件描述符。GC释放内存,但您仍然必须释放资源,如DB连接、打开的文件等,以允许其他线程使用它们
顺便说一句,最好在使用完资源后立即释放它们,而不仅仅是使用
finalize
方法,这可能需要很长时间才能被GC调用。数据库连接、线程、文件句柄、套接字—所有这些都是有限的资源
您运行的操作系统只允许这么多线程—每个线程1 MB的开销。您受到可用RAM的限制。文件句柄和套接字也是如此
数据库连接很有趣,因为它们涉及客户机和服务器。如果客户端gc正在连接,是什么告诉服务器关闭连接的?如果您在finally块中关闭失败,您很快就会发现数据库服务器将在重载下耗尽连接
最终确定不是正确的方式。不要依赖VM来调用它。编写一个
close()
方法,并在finally
块中调用它,当您的方法处理完资源时。在尽可能狭窄的范围内关闭。假设您有一个文件,您可以写入它,而不关闭资源,最终它将被GC关闭。问题是,当文件打开时,在windows中不能删除它,在Linux中可以删除它,但不能释放任何空间。如果要删除文件,您不想等到GC感觉可能要运行几个小时后再删除。请澄清您的具体问题或添加其他详细信息,以突出显示您需要的内容。正如目前所写的,很难准确地说出你在问什么。请参阅“如何询问”页面,以获取澄清此问题的帮助。您的问题很好,但通过最新添加的覆盖finalize()
,您已将其分为两个独立的问题。我会说保留问题的资源部分,四处看看,看看是否可以找到另一个关于finalize()
(我确信这里有一些问题)。+1虽然GC可以释放它们,但您无法预测GC何时运行。您自己发布的资源通常太关键,不能留给GC。