当GC可以释放所有连接时,为什么需要完成操作

时间:2018-12-21 08:28:53

标签: java io garbage-collection finalize

我有一个物体。它打开了FileConnection
现在,我引用了对象null
然后GC [ G arbage- C ollecter]运行。
因此,GC将释放对象并关闭由对象持有的FileConnection

那为什么我需要重写finalize方法?

2 个答案:

答案 0 :(得分:2)

finalize()恰好在销毁对象之前被GC调用。根本不可能发生,并且永远不会调用finalize()方法。

如果您占用资源(即打开文件),则必须正确地手动释放它。您可以使用AutoCloseable界面。

示例:

try (Scanner scan = new Scanner(new File("xxx"))) {
   // do smth.
} // scan.close() will be automatically called here

或更严格地说:

Scanner scan = null;

try {
    scan = new Scanner(new File("xxx"));
} finally {
    if (scan != null)
        scan.close();  // instead of scan.finalize();
}

PS 。切勿使用finalize()方法-这种方法已经过时,并用于非常具体的低级解决方案中。如果您问这个问题,则意味着这不是您的问题。

答案 1 :(得分:0)

您不需要覆盖finalize方法。最好不要忘记finalize方法,因为它已被弃用。

但是您确实需要在处理完资源后立即将其关闭。 GC可能会将未使用的对象保留很长时间。如果依靠GC关闭系统资源,则操作系统级别的文件句柄,锁或套接字可能用完了。 这些资源有限。