它是否有助于GC在Java中空局部变量

在离开方法之前,我被“强迫”将语句添加到最后子句中。原因是为了帮助GC。我被告知下次服务器崩溃时,我会在晚上收到短信,所以我最好这样做:-)。myLocalVar = null;

我认为这是毫无意义的,因为myLocalVar的范围限定为方法,一旦方法退出,就会“丢失”。额外的清空只会污染代码,但除此之外是无害的。

我的问题是,这个关于帮助GC的神话从何而来?(我被称为“Java内存书”)您知道任何来自“权威”的文章更深入地解释它吗?有没有可能不是神话,但真的以某种方式有所帮助?如果是这样,如何?将局部变量清空会造成任何伤害吗?

为了澄清,方法如下所示:

void method() {
  MyClass myLocalVar = null;
  try {
    myLocalVar = get reference to object;
    ... do more here ...
  } finally {
    if (myLocalVar != null) {
      myLocalVar.close(); // it is resource which we should close
    }

    myLocalVar = null; // THIS IS THE LINE I AM TALKING ABOUT
  }
}

答案 1

有一个旧的 Sun 文档,Java 平台性能(可悲的是,链接现在坏了,我无法找到一个新的),它描述了一种情况,即使一个超出范围的局部变量清空实际上对 GC 产生了影响。

但是,这篇论文提到了一个非常古老的java版本。正如这个问题中提到的(其中还包含论文中描述的问题的简要说明),这不再影响当前的JVM实现。


答案 2

Java GC应该是“健全的”,但不一定立即“完整”。换句话说,它被设计成永远不会消除至少一个路径仍然可以访问的对象(从而导致悬空的引用)。它不一定立即完成,因为它可能需要一些时间才能删除所有可以删除的内容。

我认为大多数GC神话都来自对这个概念的误解。许多人保留了太多的实例变量,这会导致问题,但这当然不是这里的问题。

其他人将局部变量放在实例变量中(例如,通过将其传递给函数),然后认为使局部变量无效会以某种方式消除该变量,这当然是不真实的。

最后,有些人过度关注GC,并认为它会为他们做功能关闭(例如,当变量被删除时关闭连接),当然事实并非如此。我认为这句话的来源是“我真的真的完成了,但我不确定如何确保这一点”。

所以,是的,你是对的,这是不必要的。