【问题标题】:Method level resource(ex:FileInputStream,Connection) not closed, will the object be eligible for garbage collection and will the resource get closed?方法级资源(例如:FileInputStream,Connection)未关闭,该对象是否有资格进行垃圾回收,资源是否会关闭?
【发布时间】:2015-03-19 03:30:21
【问题描述】:
  1. 我有一个名为 abc.txt 的文件。

  2. 我通过以下方式与它建立了联系:

    FileInputStream fs = new FileInputStream("abc.txt");

  3. 这位于方法级别。

  4. 如果我不关闭连接,对象是否有资格进行垃圾回收?

  5. 资源会被关闭吗?

程序示例:

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:在 main 方法中我取消引用 h。

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

现在这个 h 对象可以进行垃圾回收了吗? (注意:资源连接没有关闭)

【问题讨论】:

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

标签: java memory-management memory-leaks resources garbage-collection


【解决方案1】:

本地资源 - 即任何访问 Java 堆之外的东西,例如底层操作系统的文件句柄 - 通常需要手动资源管理,即它必须被关闭/释放。

一些类在对象终结时自动关闭,但这非常不可靠,因为在大型堆上终结可能会被推迟到未来的无限期
所以你真的不应该依赖无论如何,因为它会在不可预测的时间内消耗资源。

其他类可能会保留分配的资源,直到 VM 退出。在某些情况下,某些清理可能根本不会发生,例如如果 VM 没有完全退出,则临时文件可能不会被删除。

如有疑问,请联系相关班级的read the javadocs

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

您通常应该对输入流使用try-with-resource 语句。

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多