java - 为什么我需要调用 close() 或 shutdown() 方法?

标签 java garbage-collection shutdown finalize

我是 Java 的新手,在高中时期有一些 C++ 背景。现在我想做点什么,我选择了 Java 作为编程语言。

我已经完成了我的家庭作业,并且看了很多关于 Java 的“析构函数”、finalize() 方法和close()shutdown() 方法。但我仍然认为我不知道它应该如何工作(当然下面有更多信息)

好的,具体问题是为什么我需要调用close()shutdown() 方法?

在我的特殊情况下,我正在使用一个我没有开发的处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用 close( ) 方法类似。

调用 close() 方法与在 C++ 中释放内存(那很糟糕)不是一样的想法吗?意思是,我必须处理对象的删除或销毁...不是 GC 吗?

这可能是我尝试用于智能卡读卡器的类不是最好的选项,这个类实现 finalize() 方法可能会更好,所以当不再使用并准备好进行 GC,释放内存(很可能是 native 代码)和/或释放 GC 可能不知道如何执行的硬件资源。

但是文件管理类呢?那些都非常常用和维护,为什么还需要一个close() 方法?我明白存在的目的,解锁文件,但为什么我要记得关闭它?一旦对象不再使用,则自动解锁文件,至少在最常见的情况下是这样。

最后,用实现 finalize() 方法的类包装需要关闭或关闭的类是否是一个合适的解决方法,我在那里调用 close()shutdown() 方法?

我看到 finalize() 方法不是很流行,所以这就是为什么我要问这个问题应该如何解决。

提前致谢

胡安

PS:我看到的:

Is there a destructor for Java?

Why would you ever implement finalize()?

http://www.codeguru.com/java/tij/tij0051.shtml

explain the close() method in Java in Layman's terms

Do I need to close files I perform File.getName() on?

最佳答案

大多数类会在它们的finalize 方法中清理它们的外部资源,但这与 C++ 的析构函数不同——一旦不再使用对象就会调用析构函数,但会调用终结器在对象被垃圾回收之前不会被调用,并且您不知道这将在何时发生(如果您没有内存密集型程序,它可能永远不会发生)。因此,假设您正在分配一堆对象,每个对象都分配一个数据库连接(是的,您应该使用连接池,但这是假设);你使用每个对象,然后清空它的引用,这样它就可以在不先关闭它们的数据库连接的情况下被垃圾收集,现在你的数据库会因为打开的连接太多而崩溃。您可以调用 System.gc 希望这会清理连接,但这只是对垃圾收集器执行收集的建议,并且您的垃圾数据库连接可能终结器不够智能,无法完全清理连接。

长话短说,您需要调用 closeshutdown 因为您不知道对象的终结器是否/何时运行,而您不知道不知道他们在清理外部资源方面有多好。

顺便说一句,您应该使用 try-catch-finally block 来确保调用 closeshutdown - 将方法放在 finally block 中。或者,如果您使用的是 Java7,请使用 try-with-resources。

关于java - 为什么我需要调用 close() 或 shutdown() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070634/

相关文章:

python - twisted:如何在 react 器代码和线程代码之间优雅地通信?

java - Web 服务或 HTTP 数据传输

javascript - JS中频繁调用函数初始化数组的效率

.net - 同步运行 GC.Collect

java - 如果老年代的对象需要引用年轻代的对象怎么办?

c++ - C++ 中 PC 关闭的强制处理

windows - shutdown.exe 参数是破折号还是斜线?

java - 我如何编写一个方法来检查字符是否与参数匹配?

java 通过 XSD 映射到 XML

java - 如何将数组转为二维数组?