例如
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
运行此方法后会收集狗对象吗?
例如
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
运行此方法后会收集狗对象吗?
当方法返回时,它可能有资格被收集。垃圾收集何时真正发生是在未来某个未知的时间。
如果没有看到 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);
}
}
那么不,它不会被垃圾收集!
根本没有。我的意思是,时间不一定是那样的。
所有 Java 对象都在堆中分配并由 GarbageCollector 收集。GarbageCollector 在后台运行,几乎不受何时执行实际垃圾收集的限制。
从技术上讲,不可能给出和回答,因为我们还没有看到Dog#bark()
.
一般来说,答案是肯定的,Dog
实例将在方法运行后被收集,只是无法确切知道何时。这样做的原因是,除非该bark
方法Dog
与另一个对象共享对该对象的引用,否则Dog
将无法再访问 的特定实例。下次垃圾收集器运行时,它将确定它Dog
不可访问并收集用于保留它的堆空间。
这取决于物体的到达能力。如果对象不可访问,则它有资格进行 GC。何时进行 GC 取决于 JVM 实现。关于垃圾收集的真相
这篇博客文章很好地解释了垃圾收集过程的工作原理。总结一下:
如果无法从任何活动线程或任何静态引用访问对象,则该对象将有资格进行垃圾收集。它(垃圾收集器)只有在 JVM 认为它需要基于 Java 堆大小的垃圾收集时才会触发。
因此,您不应假设任何对象将被垃圾收集。