Java中的GC Setter问题

4
在一个Java的setter方法中,如果要将一个新的对象赋值给一个字段,例如:
public class MyClass
{
     private String s;
     public void mySetter(String newS) {
          s = newS;
     }
}

在调用mySetter方法后,前面的字符串s会被垃圾回收吗?还是应该在给它赋新值之前将其设置为null?

public class MyClass
{
     private String s;
     public void mySetter(String newS) {
          s = null;
          s = newS;
     }
}

看起来我不需要将其置空,但我非常希望有一些参考资料,比如JLS,来支持这些说法。 - Steven Roberts
在大多数(所有?)情况下,将变量设置为某些内容,然后立即将其设置为其他内容是没有意义的。哦,现在我看到了你的编辑。在那里需要它,因为位置元素[--size]将在某段时间内闲置,直到有人在ArrayList中插入另一个对象。 - marcus
好的,它不一定会立即被调用。例如,如果用户在应用程序中按下一个按钮,它可以为MyClass设置一个新的字符串s。 - Steven Roberts
@marcus 我撤回了那个编辑,因为我意识到我的代码和ArrayList的代码之间的差异。 - Steven Roberts
4个回答

3

只有在JVM需要内存空间时,垃圾回收才会发生。

因此,在您的情况下,它不会在方法调用后立即进行垃圾回收。

更多信息请参见此处

同时,在将字符串赋值给另一个值时,您无需先将其设置为null,因为当您将新值赋给字符串时,这意味着您的引用变量不再指向String对象的先前值,而是指向新值。像其他编程语言一样,Java为您提供了不必担心GC的灵活性。所以不要尝试做GC,Java可以为您处理它。


3

不需要将其置空,如果没有其他引用,垃圾收集器会找到该字符串。


你能提供一个支持你说法的来源吗?谢谢。 - Steven Roberts
这是垃圾回收的本质。您可以通过覆盖对象的finalize()方法来测试它以记录某些内容。在对象被垃圾回收之前,将调用此方法。 - aepurniet

3
如果您之前的字符串s没有被引用,那么它将会被垃圾回收。但是它不会在mySetter被调用后立即发生。无需将其设置为null。

3

您不需要执行s = null;这一步操作。在Java中,变量实际上是指向RAM内存中物理对象的引用。因此,当您执行s = newS;时,您会使变量s指向RAM中的一个新对象,旧对象不再被任何变量引用,并将被垃圾回收。


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