将对象引用设置为null或调用finalize()方法?

时间:2015-01-07 17:08:00

标签: java garbage-collection jvm

作为一个java初学者,我想询问是否应该将对象引用设置为null,或者在大型项目中调用finalize方法?

例如,

while( obj... some code here){
 //code stuff
}
obj = null; // or obj.finalize();

由于我完成了obj并且没有更多的引用,我应该怎么做呢?将其设置为null或调用finalize();?

我读了java doc,但这段The finalize method is never invoked more than once by a Java virtual machine for any given object.让我很困惑。这是否意味着即使我使用它,它也不会做任何事情,除非GC决定这样做?那么,我决定将obj设置为null可以帮助任何人吗? 这一切都假设它是一个大型项目,并且范围尚未结束,以便GC自行解除分配。感谢。

2 个答案:

答案 0 :(得分:7)

都不是。如果代码中不再使用obj(并且没有其他内容引用与obj相同的对象),则该对象将不再可访问,并将成为垃圾收集的候选对象。

obj设置为null将无法实现任何效果(YMMV取决于垃圾收集器的实现)。

至于致电finalize(),请不要。让垃圾收集器处理这个问题。但请注意finalize是一种与其他方法一样的方法。你引用的文字是说GC不会多次调用它,无论你的代码调用它的次数多少。

答案 1 :(得分:1)

从不手动调用对象的finalize()方法。它仅供VM使用。 VM将在适当的时间调用它(作为垃圾收集过程的一部分)。

您可以将引用变量设置为null,以使对象可能比其他情况更快地使垃圾收集符合条件,但这样做不会导致它立即被GC。 (请注意,您使用=运算符进行分配; ==测试其操作数相等的关系运算符。)

如果您的对象保持必须确保按需清理的状态,则为此实现不同的方法。 close()是此类方法的常用名称。如果可能的话,最好避免实施finalize()。 GC会自动处理您可能认为要在finalize()中手动清理的大部分资源。