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

Java 将对象引用设置为null或调用finalize()方法?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,作为一名java初学者,我想问一下是否应该将对象引用设置为null,或者在大型项目中调用finalize方法 比如说, while( obj... some code here){ //code stuff } obj = null; // or obj.finalize(); 既然我已经使用了obj,并且没有更多的引用,我该如何使用它呢?将其设置为null或调用finalize() 我读了这一段,但是Java虚拟机对任何给定对象调用finalize方法的次数从未超过一次。让我感到困惑。这是

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

比如说,

while( obj... some code here){
 //code stuff
}
obj = null; // or obj.finalize();
既然我已经使用了
obj
,并且没有更多的引用,我该如何使用它呢?将其设置为null或调用finalize()

我读了这一段,但是Java虚拟机对任何给定对象调用finalize方法的次数从未超过一次。让我感到困惑。这是否意味着即使我使用它,它也不会做任何事情,除非GC决定这样做?那么,我将
obj
设置为null的决定是否有帮助?


这一切都假设它是一个大型项目,并且范围还没有结束,以便GC自行解除分配它。谢谢。

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

obj
设置为
null
将一事无成(YMMV取决于垃圾收集器的实现)


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

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

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


若您的对象保持您必须确保按需清理的状态,那个么为该状态实现不同的方法
close()
是此类方法的常用名称。最好尽可能避免实现
finalize()
。GC将自动处理您可能认为需要在
finalize()

中手动清理的大多数资源。这可能有助于理解
finalize
-方法和GC:感谢回复wassgren,我已经阅读了java文档。但也有类似的解决方案迫使最终确定方法,并且实际有效,我想知道在一个大型项目上应该怎么做。永远不要使用最终确定方法。这是完全不可预测的。是的,但是obj是否有资格让GC在运行时选择,还是等待调用obj的方法的范围结束并决定?同样,正如我在另一篇评论中所写,强制使用最终化方法是否值得?正如示例所述,@VasilisCh是一名初学者,您不必为此担心。让自动GC处理它。它将检测对象何时不再使用并将其删除。只要在使用完对象后停止引用它,一切都会自行处理。@Vasilich否,作用域是定义可以在何处使用名称的不同概念。处理GC合格性的是可达性。重写该对象上的finalize方法并调用它会有什么不同吗?正如我在回答中所读到的,它考虑到了这一点,这是真的吗?我重复一遍:永远不要手动调用对象的
finalize()
方法。它是从
java.lang.Object
继承的还是重写的,这没有什么区别。顺便说一句,你链接的答案非常好,它与我说的任何话都不矛盾。@VasilisCh不要覆盖
finalize
,除非你有很好的理由。此外,作为初学者,只需忽略所有与GC相关的内容。它做得很好,你做的任何事情都有可能让事情变得更糟。你需要关注的案例非常罕见(例如,你可能会在一个月内做一些高级的事情)。感谢你回答MaaTiNus,我只是好奇它,因为在C++上我们必须重新分配和处理。由于JVM为我们做了这些,我想如果我对垃圾收集器有更多的了解,也许我可以提高性能一点。事实上,我的swing项目起步很低,但由于我想向它添加越来越多的功能,结果却不断增长。所以我只是想知道,因为它已经超过了4万行代码,我是否可以在性能方面提供帮助。@VasilisChados不客气。Java非常不同。您必须关闭流并处理图形(使用
try finally
,不要依赖
finalize
,因为它不像析构函数;对大多数使用来说调用它太晚了!),但您几乎不需要关心内存。使用Swing,当不再需要组件时,需要注销侦听器。Java性能比C++更复杂,因为java编译器。在优化之前,请确保您知道存在问题并仔细查找。