Java 方法级资源(例如:FileInputStream,连接)未关闭,对象是否有资格进行垃圾收集,资源是否会关闭?

Java 方法级资源(例如:FileInputStream,连接)未关闭,对象是否有资格进行垃圾收集,资源是否会关闭?,java,memory-management,memory-leaks,resources,garbage-collection,Java,Memory Management,Memory Leaks,Resources,Garbage Collection,我有一个名为abc.txt的文件 我通过以下方式连接到它: FileInputStream fs=新的FileInputStream(“abc.txt”) 这驻留在方法级别 如果我不关闭连接,对象是否有资格进行垃圾收集 资源是否会关闭 程序示例: class Hello { public void readFile(){ FileInputStream fs = new FileInputStream("abc.txt"); /* here i wont close the connecti

我有一个名为abc.txt的文件

  • 我通过以下方式连接到它:

    FileInputStream fs=新的FileInputStream(“abc.txt”)

  • 这驻留在方法级别

  • 如果我不关闭连接,对象是否有资格进行垃圾收集

  • 资源是否会关闭

  • 程序示例:

    class Hello {
    public void readFile(){
     FileInputStream fs = new FileInputStream("abc.txt");
    /* 
    here i wont close the connection
    
    */
    }
    
    }
    class Demo {
    public static void main(String args[]) {
     Hello h = Hello();
      h.readFile();
    /*
    Some other operation
    */
    }
    }
    
    场景2:在主方法i中,取消对h的引用

    class Demo {
      public static void main(String args[]) {
       Hello h = Hello();
       h.readFile();
       h = null;//Dereference
      }
    }
    

    现在这个h对象符合垃圾收集的条件了。(注意:资源连接未关闭)

    本机资源-即任何访问java堆之外的内容的内容,如底层操作系统的文件句柄-通常需要手动进行资源管理,即必须关闭/解除分配

    某些类在对象终结时自动关闭,但这是非常不可靠的,因为在大型堆上,终结可能会被推迟到将来的某个不确定的时间点。
    因此,无论如何,您都不应该依赖于它,因为它会在不可预测的时间内消耗资源

    其他类可能会保留资源分配,直到VM退出。在某些情况下,某些清理可能根本不会发生,例如,如果VM没有干净地退出,tempfiles可能不会被删除

    如有疑问,请说明所涉类别

    在您的特定玩具示例中,VM退出可能发生在垃圾收集开始之前


    您通常应该对输入流使用语句。

    一般经验法则,如果打开,则必须关闭它。无法100%确定资源是否将关闭,因为资源可能包含对其他不符合垃圾收集条件的对象的引用。