Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的资源是什么?为什么在使用后必须关闭它?_Java_Garbage Collection - Fatal编程技术网

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

java中的资源是什么?为什么在使用后必须关闭它?,java,garbage-collection,Java,Garbage Collection,java中“资源”一词的含义是什么? 为什么即使垃圾收集器在jvm中运行,在使用后也必须关闭它? 为什么我们必须在finally块中编写资源清理代码 java中“资源”一词的含义是什么 典型的Java应用程序处理几种类型的资源,如文件、流、套接字和数据库连接 为什么我们必须在finally块中编写资源清理代码 提供了Java 7对自动资源管理问题的答案 必须非常小心地处理此类资源,因为它们为其操作获取系统资源。因此,您需要确保即使在出现错误的情况下也能释放它们 事实上,不正确的资源管理是生产应用

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。