方法运行完毕后,是否收集局部变量

时间:2012-07-18 19:06:56

标签: java variables garbage-collection

例如

public void doSomething() {
   Dog smallDog = new Dog();
   smallDog.bark();
}

运行此方法后会收集狗对象吗?

5 个答案:

答案 0 :(得分:6)

当方法返回时,可以收集符合条件的。垃圾收集实际发生的时候是未来的未知时间。

如果没有看到bark()的实现,就无法确定。

如果这是你的吠声:

public void bark() {
   BarkListeners.callBack(this);
}

public class BarkListeners {
  private static final List<Dog> barkers = new ArrayList<Dog>();

  public static void callBack(Dog dog) {
    barkers.add(dog);
  }
}

然后不,它不会被垃圾收集!

答案 1 :(得分:2)

根本没有。我的意思是,时间不必那样。

所有Java对象都在堆中分配并由GarbageCollector收集。并且GarbageCollector在后台运行,几乎没有约束何时执行实际的垃圾收集。

答案 2 :(得分:1)

从技术上讲,由于我们没有看到Dog#bark()的实施,因此无法给出和回答。

通常,答案是肯定的,Dog实例将在方法运行后收集,它无法准确知道何时。这样做的原因是,除非bark方法与另一个对象共享对Dog对象的引用,否则Dog的特定实例将不再可访问。下次垃圾收集器运行时,它将确定无法访问Dog并收集用于保留它的堆空间。

答案 3 :(得分:0)

取决于物体的到达能力。如果无法访问对象,那么它对于GC是合法的。什么时候GC依赖于JVM实现。 Truth About Garbage Collection

答案 4 :(得分:0)

This blog post提供了有关垃圾收集过程如何工作的很好的解释。总结一下:

  

如果对象无法从任何活动线程或任何静态引用访问,则它有资格获得垃圾收集。它(垃圾收集器)只有在JVM认为需要基于Java堆大小的垃圾收集时才会触发。

因此,您不应该假设任何对象何时被垃圾收集。