Finalize()清理与垃圾收集器从内存中删除对象

时间:2012-06-16 17:44:53

标签: java garbage

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

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

3 个答案:

答案 0 :(得分:10)

  

清理物品的任务有什么区别(   在finialize

中将它们设置为NULL)

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

  

从内存中删除对象?

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

需要在finalize方法中设置对 null 的引用。 当垃圾收集器调用 finalize 时,对象及其引用将很快消失。

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

如果您的对象正在处理os资源,则会出现编写自己的finalize方法有意义的罕见情况。但是,通常您使用os访问的标准包

答案 1 :(得分:1)

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

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

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

只是不要保留额外的参考资料,让GC做它的工作。

答案 2 :(得分:0)

当对象没有更多引用时,垃圾收集器会调用

finalize()。你可以覆盖它,最好的做法是在try-catch-finally块中使用它来释放非java资源,比如文件。无论如何,如果你以这种方式使用它,你也应该调用super.finalize()来确保类层次结构的完成。

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