【发布时间】:2010-09-15 09:02:43
【问题描述】:
Java 有析构函数吗?我似乎无法找到任何有关此的文档。如果没有,我怎样才能达到同样的效果?
为了使我的问题更具体,我正在编写一个处理数据的应用程序,并且规范说应该有一个“重置”按钮,可以将应用程序恢复到其刚启动的原始状态。但是,除非应用程序关闭或按下重置按钮,否则所有数据都必须是“实时的”。
我通常是一名 C/C++ 程序员,我认为这很容易实现。 (因此我计划最后实现它。)我构建了我的程序,使所有“可重置”对象都在同一个类中,这样我就可以在按下重置按钮时销毁所有“活动”对象。
我在想如果我所做的只是取消引用数据并等待垃圾收集器收集它们,如果我的用户重复输入数据并按下重置按钮,会不会出现内存泄漏?我也在想,既然 Java 作为一门语言已经相当成熟,应该有一种方法可以防止这种情况发生或优雅地解决这个问题。
【问题讨论】:
-
如果你持有对你不需要的对象的引用,那么只有内存泄漏。即您的程序中有错误。 GC 将根据需要运行(有时会更快)
-
如果你通过对象快速处理数据,虚拟机不会很快运行 GC。认为 GC 总能跟上进度或做出正确决定的想法是错误的。
-
@Kieveli JVM 不会在报错之前运行 GC 吗?
-
是的,如果有 Java 的析构函数可以一次性销毁它就好了。
-
@WVrock - 有趣的问题。答案是“不”(至少对于某些类型的“通过对象快速处理数据”),但原因很微妙。当您将 97% 的时间花在垃圾收集上,而只有 3% 的时间花在实际程序逻辑上时,就会发生实际错误,因为大多数引用仍然有指向它们的指针。如果“快速处理”使用少量指针不会有问题。
标签: java garbage-collection destructor finalize