Java 为什么这个空赋值会使对象更快地被垃圾收集?
Oracle Java杂志包含一篇关于JavaFX设计模式的文章,其中包含: 我不明白为什么Java 为什么这个空赋值会使对象更快地被垃圾收集?,java,Java,Oracle Java杂志包含一篇关于JavaFX设计模式的文章,其中包含: 我不明白为什么point=null赋值会使point对象更快地被垃圾收集。每个循环都(重新)分配了变量,循环不会阻塞,因为它只在有东西要得到时才运行 即使循环执行阻塞调用,点变量也会在每次循环迭代中移出作用域,因此它会使引用符合垃圾收集的条件 我错过了什么?文章作者为什么要添加这个特定的null赋值 赋值null将有助于提示编译器不再需要该对象。然而,这不起作用。编译器不可能知道存在对点对象的其他引用。毕竟,对象可能在
point=null
赋值会使point对象更快地被垃圾收集。每个循环都(重新)分配了变量,循环不会阻塞,因为它只在有东西要得到时才运行
即使循环执行阻塞调用,点
变量也会在每次循环迭代中移出作用域,因此它会使引用符合垃圾收集的条件
我错过了什么?文章作者为什么要添加这个特定的
null
赋值 赋值null
将有助于提示编译器不再需要该对象。然而,这不起作用。编译器不可能知道存在对点
对象的其他引用。毕竟,对象可能在另一个列表、另一个队列或其他东西中,可能包含对它的引用。因此,它不是编译器的“提示”,也不是垃圾收集器的有用提示,因为您所做的只是将引用设置为null
。然而。。。
如果队列是持有对点
引用的唯一对象,则通过设置点=null
释放对它的最后一个引用,这意味着从此点开始,对象不再可访问,并且可以进行垃圾收集
对我来说,设置一个立即离开作用域的
null
引用似乎有点多余。将某物设置为null
不会神奇地导致GC启动。GC会在任何时候启动,或者在某些情况下,对于具有并行GC的语言,GC可能会持续运行 总结和的现场评论:
我不明白为什么point=null赋值会使point对象更快地被垃圾收集。
不会的。这完全是无稽之谈 我错过了什么? 没什么 文章作者为什么要添加此特定的
null
赋值?
因为文章作者不懂Java。有一个相关的问题,即取消引用与等待变量超出作用域的性能,因为文章作者不懂Java。它不会。这完全是无稽之谈,“作者是最近当选的Java冠军”,因此作者不理解Java的可能性似乎不大。这仍然不能解释空赋值的必要性,我仍然认为没有优势。“这仍然不能解释空赋值的必要性”没有必要。你不会在Oracle的Java杂志上看到这一点。为什么不呢?这是一本杂志,不是语言规范。
while(!pointQueue.isEmpty()) {
PointPojo point = pointQueue.poll();
//coordinate transform data to canvas pixel
double x = transformXToScreen(point.x);
double y = transformYToScreen(point.y);
//encourage the object to be garbage collected sooner
point = null;
g.fillOval(x, y, radius, radius);
}