例如
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
运行此方法后会收集狗对象吗?
答案 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堆大小的垃圾收集时才会触发。
因此,您不应该假设任何对象何时被垃圾收集。