作为一个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自行解除分配。感谢。
答案 0 :(得分:7)
都不是。如果代码中不再使用obj
(并且没有其他内容引用与obj
相同的对象),则该对象将不再可访问,并将成为垃圾收集的候选对象。
将obj
设置为null
将无法实现任何效果(YMMV取决于垃圾收集器的实现)。
至于致电finalize()
,请不要。让垃圾收集器处理这个问题。但请注意finalize
是一种与其他方法一样的方法。你引用的文字是说GC不会多次调用它,无论你的代码调用它的次数多少。
答案 1 :(得分:1)
从不手动调用对象的finalize()
方法。它仅供VM使用。 VM将在适当的时间调用它(作为垃圾收集过程的一部分)。
您可以将引用变量设置为null
,以使对象可能比其他情况更快地使垃圾收集符合条件,但这样做不会导致它立即被GC。 (请注意,您使用=
运算符进行分配; ==
是测试其操作数相等的关系运算符。)
如果您的对象保持必须确保按需清理的状态,则为此实现不同的方法。 close()
是此类方法的常用名称。如果可能的话,最好避免实施finalize()
。 GC会自动处理您可能认为要在finalize()
中手动清理的大部分资源。