Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法运行完成后是否收集局部变量_Java_Variables_Garbage Collection - Fatal编程技术网

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。