Java 必须将引用设置为null才能使垃圾收集工作吗

Java 必须将引用设置为null才能使垃圾收集工作吗,java,memory,jvm,Java,Memory,Jvm,嗨,我正在尝试发现为什么我的程序通常运行得比我想要的慢,所以提前感谢你的帮助! 例如,我有一段代码,我想了解一下 第二行。我创建了一个新对象。这将在我的程序中发生数千次。在gc销毁旧对象之前,我是否必须将其清除?或者gc会在我的程序后面收集其他对象使用的所有内存 或者另一种选择是这样的:分配一定数量的内存,每次我创建一个新对象,它就会被分配到完全相同的内存。 Bruno让我展示一段更真实的代码,这样我们就可以找出它运行缓慢的原因。但是,因为你的回答,布鲁诺,我意识到我的代码是这样的 1.

嗨,我正在尝试发现为什么我的程序通常运行得比我想要的慢,所以提前感谢你的帮助!
例如,我有一段代码,我想了解一下

第二行。我创建了一个新对象。这将在我的程序中发生数千次。在gc销毁旧对象之前,我是否必须将其清除?或者gc会在我的程序后面收集其他对象使用的所有内存

或者另一种选择是这样的:分配一定数量的内存,每次我创建一个新对象,它就会被分配到完全相同的内存。
Bruno让我展示一段更真实的代码,这样我们就可以找出它运行缓慢的原因。但是,因为你的回答,布鲁诺,我意识到我的代码是这样的

1. Object object = null;
2. while(conditionIsTrue){
3.      object = new Object();
4.  }

所以我意识到我对我的对象有很强的引用。谢谢你,布鲁诺

在这种情况下,不需要
object=null
以允许GC清除
新对象()
,因为在实例化对象的迭代完成后(即第3行),没有对该对象的引用

规则是:只要不再指向某个对象,就允许GC清除该对象。它可能不会立即清除对象,这可能需要一些时间,但除非您设法获取对它的新的强引用(是的,有很多方法!请参见和示例),否则它最终将被清除,而且肯定是在它抛出错误之前

另外,JVM在分配内存方面非常聪明。有一种叫做:它允许JVM理解
new Object()
在循环之外的任何地方都没有使用,因此它甚至可以在堆栈上而不是堆上为对象分配内存!因此,该特定对象可能根本不需要GC——当该方法完成时,该对象将自动清除

我甚至猜测JVM可能会检测到实例化该对象完全没有明显的效果,甚至可能只是选择不运行该行#2(但这只是一个猜测,如果我正在编写编译器,我可能会考虑进行优化——如果有人确实知道这种情况是否发生,请添加注释!)


如果你的程序运行得比你希望它运行的慢,那么你就必须显示一些更真实的代码。你可能认为你的真实代码和你所询问的片段之间的细微差别可能对JVM有很大的不同!

< P>这也将有助于知道你可以使用一个工具来查看你的程序。使用内存、线程等


VisualVM从版本6更新7开始就与JDK捆绑在一起,您可以在JDK_HOME/bin中找到它

非常感谢!这对我帮助很大!我一定会清理一些旧的“邋遢”编程习惯。不,您不需要清空旧指针。而且从性能的角度来看,您的第一个和第二个代码片段之间确实没有明显的差异。(Java中没有“强引用”的区别。)@HotLicks,您所说的没有“强引用”到底是什么意思Java中的区别?有很多不同类型的引用,包括强引用、软引用、弱引用、幻影引用,每种引用在如何与GC交互方面都有非常特殊的特征。“通常运行速度比我想要的慢”是正常的。每个计算机程序的运行速度总是比你想要的慢。然后你升级你的硬件,思考魔兽世界5分钟,直到它再次开始感觉它在减速,即使它不是。微优化不会改变这一点,这就是你在这里尝试的。@BrunoReis-有不同的参考对象类型,正确,但普通指针不是“强”或“弱”,不同于一些基于C的GC方案。除非您做一些显式的操作,否则通常不会创建引用对象,而且一个天真的Java程序员几乎无法做到这一点。@jwenting我理解,对于小程序来说,微优化不会产生巨大的差异。但是对于一个拥有超过10万行代码的程序来说是的,但谢谢你的意见。
1. Object object = null;
2. while(conditionIsTrue){
3.      object = new Object();
4.  }