Java 方法运行完成后是否收集局部变量
比如说Java 方法运行完成后是否收集局部变量,java,variables,garbage-collection,Java,Variables,Garbage Collection,比如说 public void doSomething() { Dog smallDog = new Dog(); smallDog.bark(); } 运行此方法后会收集dog对象吗?简单地说,不会。我的意思是,时间不必如此 所有Java对象都在堆中分配,并由垃圾收集器收集。GarbageCollector在后台运行,几乎不受何时执行实际垃圾收集的限制。这取决于对象的可达性。若对象不可访问,那个么它可用于GC。何时进行GC取决于JVM实现 当方法返回时,它可以被收集。垃圾收集实际
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
运行此方法后会收集dog对象吗?简单地说,不会。我的意思是,时间不必如此
所有Java对象都在堆中分配,并由垃圾收集器收集。GarbageCollector在后台运行,几乎不受何时执行实际垃圾收集的限制。这取决于对象的可达性。若对象不可访问,那个么它可用于GC。何时进行GC取决于JVM实现 当方法返回时,它可以被收集。垃圾收集实际发生的时间是将来的某个未知时间 如果没有看到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);
}
}
public-void-bark(){
barklisters.callBack(this);
}
公听者{
private static final List barkers=new ArrayList();
公共静态无效回调(Dog-Dog){
添加(狗);
}
}
那么不,它不会被垃圾收集 很好地解释了垃圾收集过程是如何工作的。总结如下:
如果无法从任何活动线程或任何静态引用访问对象,则该对象有资格进行垃圾收集。只有当JVM认为它需要基于Java堆大小的垃圾收集时,才会触发它(垃圾收集器)
因此,您不应该假设任何对象何时会被垃圾收集。从技术上讲,不可能给出答案,因为我们还没有看到
Dog#bark()
的实现
通常,答案是肯定的,
Dog
实例将在方法运行后被收集,只是不可能知道确切的时间。原因是除非bark
方法与另一个对象共享对Dog
对象的引用,否则将无法访问Dog
的特定实例。下次垃圾收集器运行时,它将确定Dog
不可访问,并收集用于保存它的堆空间。垃圾收集器将在JVM希望时运行。s/when/when和if/。无法保证GC会运行。除创建狗实例外,什么时候收集狗实例?:-伟大的解释。因此,只有在没有更多的呼叫的情况下,它才会被收集。还有一种可能性——它甚至不需要垃圾收集。JIT可以执行转义分析,它检查是否满足了许多先决条件(在本地上下文之外没有对对象转义的引用,它没有终结器,可能还有更多)。如果满足这些先决条件,则可以在堆栈上分配对象=不需要GC。