4

例如

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

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

4

5 回答 5

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);
  }
}

那么不,它不会被垃圾收集!

于 2012-07-18T19:12:11.630 回答
2

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

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

于 2012-07-18T19:08:30.713 回答
1

从技术上讲,不可能给出和回答,因为我们还没有看到Dog#bark().

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

于 2012-07-18T19:15:31.117 回答
0

这取决于物体的到达能力。如果对象不可访问,则它有资格进行 GC。何时进行 GC 取决于 JVM 实现。关于垃圾收集的真相

于 2012-07-18T19:09:59.510 回答
0

这篇博客文章很好地解释了垃圾收集过程的工作原理。总结一下:

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

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

于 2012-07-18T19:13:09.523 回答