垃圾回收:这个对象会被回收吗?

3

可能重复:
将Java对象设置为null还会有任何作用吗?

在一个方法中,我多次使用同一变量,并引用它指向一个新对象。从垃圾收集的角度来看,将其置为空后再使其引用新对象是否是一个好习惯。

例如:

StopWatch watch = new StopWatch();
watch.start();
//some code
watch.stop();
//some code
watch = null;
watch = new StopWatch();
watch.start();
//some code
watch.stop();
//some code

不确定在这种情况下将其置空是否会对GC产生影响。请指导。

谢谢!


应该没有差别 - Karthik T
2
如果唯一的原因是为了标记变量以便GC将其删除,那么将变量设置为null几乎没有用处。如果您new另一个对象并将其存储在相同的变量中,则先前的对象将在GC感觉合适时被收集。因此,即使不设置null,上面的代码也可以正常工作。 - bas
4个回答

7
在那一点上赋值为null没有任何影响,因为您将立即对该变量进行新值的赋值。
在Java中,给一个变量赋值null并没有什么"神奇"的地方。它不会立即使对象被垃圾回收。它所做的只是破坏了该对象可能可达的(可能)许多“路径”之一。如果该路径将在下一次GC运行之前自行断开/消失,则赋值null没有任何效果。
通常情况下,在Java中不值得对变量或字段赋空值,特别是当局部变量即将被重写或即将退出作用域时更不必要。

对我而言,将变量置空的诱惑表明你的方法应该被拆分。 - Peter Lawrey

2
不,将其设为null在这种情况下不会有任何影响。如果它没有立即分配给其他变量,那么就会有所不同。在那种情况下,对象将变得适合进行垃圾回收,而不是等待引用超出范围。通常GC会收集那些没有引用的对象。由于您将引用指向内存中的其他对象,因此对先前对象的引用已经丢失。因此,无论是否将其分配为null,都没有区别。只要没有其他引用,就可以进行垃圾回收。

2

当一个对象可以被垃圾回收时,JVM会将该对象赋值为null。

通常在Java中没有必要将变量或字段设置为null,特别是对于即将被覆盖或即将超出范围的局部变量而言更是如此。


1

因为你在将对象置空后立即分配一个新对象,所以不会有任何影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接