use*_*570 5 java garbage-collection shutdown finalize
我是Java新手,在高中时期有一些C++背景.现在我正在努力创造一些东西,我选择Java作为编程语言.
我完成了我的作业,看了很多关于Java的"析构函数",finalize()方法和close()或shutdown()方法.但我仍然认为我不知道这应该如何工作(当然下面有更多信息)
好的,具体的问题是为什么我需要调用close()或shutdown()方法?
在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似.
不是调用close()方法与在C++中释放内存的想法相同(那很糟糕)?意思是,我必须处理对象的删除或破坏......不是GC的用途吗?
我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源.
但是文件管理类呢?那些是非常常用和维护的,为什么仍然需要close()方法?我理解存在的目的,解锁文件,但为什么我要记得关闭它?一旦不再使用该对象,则至少在最常见的情况下自动解锁文件.
最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()或shutdown()方法?
我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因.
提前致谢
胡安
PS:我见过的:
大多数类会在其方法中清理其外部资源finalize,但这与 C++ 的析构函数不同 - 一旦不再使用对象,就会调用析构函数,但直到对象被垃圾收集后才会调用终结器,并且您不知道这种情况何时会发生(如果您没有内存密集型程序,则可能永远不会发生)。假设您正在分配一堆对象,每个对象都分配一个数据库连接(是的,您应该使用连接池,但这是一个假设);您使用每个对象,然后将其引用清空,以便可以在不先关闭其数据库连接的情况下对其进行垃圾收集,现在您的数据库将因为打开的连接太多而对您造成困扰。您可以调用System.gc,希望这会清理连接,但这只是对垃圾收集器执行收集的建议,并且您的垃圾数据库连接的终结器可能不够智能,无法完全清理连接。
长话短说,您需要调用closeandshutdown因为您不知道对象的终结器是否/何时运行,并且您不知道它们在清理外部资源方面有多好。
顺便说一句,您应该使用 try-catch-finally 块来确保调用close并shutdown- 将方法放入 finally 块中。或者,如果您使用的是 Java7,请使用 try-with-resources。
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |