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
分配?
答案 0 :(得分:2)
通过David Conrad和Boris the Spider总结即时评论:
我不明白为什么point = null赋值会使点对象早日被垃圾回收。
不会。这完全是荒谬的。
我想念什么?
没事。
文章作者为什么要添加此特定的VARCHAR(size)
分配?
因为本文的作者不懂Java。
答案 1 :(得分:1)
分配null
可以向编译器提示不再需要该对象。但是,这不起作用。编译器无法知道还有Point
对象的其他引用。毕竟,该对象可能在另一个List,另一个Queue或其他内容中可能包含对该对象的引用。因此,对于编译器而言,这不是一个“提示”,对于垃圾回收器来说,它也不是一个有用的提示,因为您所做的只是设置对null
的引用。然而...
如果Queue是持有对Point
的引用的唯一对象,则通过设置point = null
释放对它的最后一个引用,这意味着从现在开始,该对象不再可访问并且可以被垃圾回收。
设置对null
的引用会立即离开范围对我来说似乎有点多余。将内容设置为null
不会神奇地导致GC踢入。GC随时可以踢入,或者在某些情况下,对于具有并行GC的语言,GC可能会恒定运行。