java - 当GC可以释放所有连接时,为什么需要finalize

标签 java io garbage-collection finalize

我有一个对象。它打开了一个FileConnection
现在,我引用了对象 null
然后 GC [Garbage-Collecter] 运行。
因此,GC 将释放该对象并关闭该对象所持有的FileConnection

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

最佳答案

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

如果你获取了一个资源(即打开一个文件),你必须正确地手动释放它。您可以使用AutoCloseable接口(interface)。

示例:

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();
}

P.S. 切勿使用 finalize() 方法 - 该方法已过时并用于非常具体的低级解决方案。如果你问这个问题,那就意味着这不是你的问题。

关于java - 当GC可以释放所有连接时,为什么需要finalize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53881429/

相关文章:

.net - 如何提高垃圾收集性能?

java - AS7/Picketbox 4 中 SecurityAssociation 的替代方案

ruby - 为什么 IO::WaitReadable 对于 STDOUT 的引发方式与 STDERR 的引发方式不同?

python - 在 Python 中实现正则表达式以替换文本文件中每次出现的 "meshname = x"

.NET 垃圾收集、C++/CLI interior_ptr 和线程安全

iphone - ARC 和 MRC 之间的区别

Java流如何在List的嵌套List中添加值

java - Spring 4 + Jersey 集成@Autowired

java - 将图像保存到数据库时JAVA中的classcastException

c - 比 fgets 更快的 I/O 函数