3

我正在阅读有关 finalize() 方法并且很好奇:

在 finalize 中清理对象(将它们设置为 NULL )的任务和从内存中删除对象有什么区别?

4

3 回答 3

10

finalize 中清理对象(将它们设置为 NULL )的任务有什么区别

设置为null会删除对对象的ONE引用。如果不再存在对某个对象的引用,则允许(不需要)垃圾收集器删除该对象

并从内存中删除一个对象?

java中没有明确的方法来删除(销毁,删除)一个对象。垃圾收集器会在他喜欢的时候做。尤其是从删除最后一个引用到删除/销毁对象的时间是不确定的

不需要在finalize方法中设置对null的引用。当垃圾收集器调用最终确定对象时,它的引用无论如何都会很快消失。

在我很长的 Java 经验中,我从未编写过自己的 finalize 方法。

如果您的对象正在处理 os-resources,那么编写自己的 finalize 方法是有意义的罕见情况。但是,通常您使用标准包进行操作系统访问

于 2012-06-16T18:09:50.160 回答
1

将对象设置为时不会“清理”对象null,只是将引用设置为 null,请考虑:

Object a = new Object();
Object b = a;
a = null;
System.out.println(b);

一旦一个对象丢失了所有引用,它将在下一次 GC 传递时被收集。Finalize 是一种在发生这种情况时被调用的方法,您应该避免使用它

只是不要保留额外的引用,让 GC 完成它的工作。

于 2012-06-16T17:56:18.127 回答
0

当对象没有更多引用时,垃圾收集器会调用 finalize()。您可以覆盖它,最佳做法是在 try-catch-finally 块中使用它来释放文件等非 Java 资源。无论如何,如果您以这种方式使用它,您还应该调用 super.finalize() 以确保类层次结构最终确定。

此方法始终用于高级用途,不应在正常生产代码中使用。在使用这些资源的方法中的 finally 子句中释放您的资源。

于 2012-06-16T17:47:11.940 回答