Java有析构函数吗?我好像找不到任何关于这个的文件。如果没有,我怎样才能达到同样的效果?
为了使我的问题更具体,我正在编写一个处理数据的应用程序,规范说应该有一个“重置”按钮,使应用程序恢复到最初的启动状态。但是,除非应用程序关闭或按下重置按钮,否则所有数据必须是“活的”。
作为一个通常的C/ c++程序员,我认为这是微不足道的实现。(因此我打算最后实现它。)我构造了我的程序,使所有“可重置”的对象都在同一个类中,这样当按下重置按钮时,我就可以销毁所有“活动”对象。
我在想,如果我所做的只是解除对数据的引用,并等待垃圾收集器收集它们,如果我的用户重复输入数据并按下重置按钮,是否会出现内存泄漏?我还在想,既然Java作为一种语言相当成熟,应该有一种方法来防止这种情况发生或优雅地解决这个问题。
应该避免使用finalize()方法。它们不是一种可靠的资源清理机制,滥用它们可能会在垃圾收集器中引起问题。
如果你在对象中需要一个释放调用,比如释放资源,使用显式的方法调用。这个约定可以在现有的api中看到(例如Closeable, Graphics.dispose(), Widget.dispose()),通常通过try/finally调用。
Resource r = new Resource();
try {
//work
} finally {
r.dispose();
}
尝试使用已处理对象应该抛出运行时异常(参见IllegalStateException)。
编辑:
我在想,如果我所做的只是
来解除对数据的引用并等待
垃圾收集器来收集它们,
会不会有内存泄漏,如果我的
用户反复输入数据和
按了重置键?
一般来说,您所需要做的就是取消对对象的引用——至少,这是它应该工作的方式。如果您担心垃圾收集,请查看Java SE 6 HotSpot[tm]虚拟机垃圾收集调优(或您的JVM版本的等效文档)。
应该避免使用finalize()方法。它们不是一种可靠的资源清理机制,滥用它们可能会在垃圾收集器中引起问题。
如果你在对象中需要一个释放调用,比如释放资源,使用显式的方法调用。这个约定可以在现有的api中看到(例如Closeable, Graphics.dispose(), Widget.dispose()),通常通过try/finally调用。
Resource r = new Resource();
try {
//work
} finally {
r.dispose();
}
尝试使用已处理对象应该抛出运行时异常(参见IllegalStateException)。
编辑:
我在想,如果我所做的只是
来解除对数据的引用并等待
垃圾收集器来收集它们,
会不会有内存泄漏,如果我的
用户反复输入数据和
按了重置键?
一般来说,您所需要做的就是取消对对象的引用——至少,这是它应该工作的方式。如果您担心垃圾收集,请查看Java SE 6 HotSpot[tm]虚拟机垃圾收集调优(或您的JVM版本的等效文档)。
看看try-with-resources语句。例如:
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
System.out.println(br.readLine());
} catch (Exception e) {
...
} finally {
...
}
在这里,不再需要的资源在BufferedReader.close()方法中被释放。您可以创建自己的实现AutoCloseable的类,并以类似的方式使用它。
在代码结构方面,这个语句比finalize更有局限性,但同时它使代码更易于理解和维护。此外,也不能保证在应用程序的生存期内调用finalize方法。