为什么此空赋值会使对象早日被垃圾回收?

时间:2018-07-01 08:54:24

标签: java

Oracle Java Magazine包含有关JavaFX设计模式的文章,其中包含following code

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);
}

我看不出为什么point = null分配会使点对象早日被垃圾回收。每个循环都有(重新)分配变量,该循环不会阻塞,因为它只在有东西可获取的情况下运行。

即使循环会执行阻塞调用,point变量也会在每次循环迭代时移出作用域,因此它将使引用有资格进行垃圾回收。

我想念什么?为什么文章的作者会添加此特定的null分配?

2 个答案:

答案 0 :(得分:2)

通过David ConradBoris the Spider总结即时评论:

我不明白为什么point = null赋值会使点对象早日被垃圾回收。

不会。这完全是荒谬的。

我想念什么?

没事。

文章作者为什么要添加此特定的VARCHAR(size)分配?

因为本文的作者不懂Java。

答案 1 :(得分:1)

分配null可以向编译器提示不再需要该对象。但是,这不起作用。编译器无法知道还有Point对象的其他引用。毕竟,该对象可能在另一个List,另一个Queue或其他内容中可能包含对该对象的引用。因此,对于编译器而言,这不是一个“提示”,对于垃圾回收器来说,它也不是一个有用的提示,因为您所做的只是设置对null的引用。然而... 如果Queue是持有对Point的引用的唯一对象,则通过设置point = null释放对它的最后一个引用,这意味着从现在开始,该对象不再可访问并且可以被垃圾回收。

设置对null的引用会立即离开范围对我来说似乎有点多余。将内容设置为null不会神奇地导致GC踢入。GC随时可以踢入,或者在某些情况下,对于具有并行GC的语言,GC可能会恒定运行。