在方法定义中创建的对象的生命周期

时间:2016-07-26 04:36:15

标签: java

我对在方法定义中创建的对象的生命有疑问。据我所知,方法本地的所有变量的生命都以该方法的完成结束。因此,如果我在方法中创建一个对象,它将在执行该方法后被销毁。

3 个答案:

答案 0 :(得分:3)

一旦执行超出了创建对象的范围,或者发生了另一个赋值操作,并且没有对所述对象的引用,运行时将标记该对象进行垃圾收集(意味着该对象< em>可能仍然存在,只是不再可访问。)

销毁对象(垃圾收集)的实际时间取决于其他因素,例如应用程序的总体内存消耗。

答案 1 :(得分:2)

一旦运行时可以证明它永远不会被访问,对象将成为符合条件的用于垃圾收集。实际上,只要运行时发现它很方便,它就会被收集。

请注意,对象生命周期不受范围(这是一种语法结构)的约束,而是由可达性控制。当方法仍在执行时,对象可以停止可到达(例如,当没有触及对象的代码行仍未执行时),或者它可能继续可到达方法返回后很久(例如,如果对象的引用存储在静态字段中或从方法返回)。

Raymond Chen写了一篇很棒的博客文章,名为When is an object eligible for garbage collection?关于C#,而不是Java,但类似的原则适用。

答案 2 :(得分:1)

它取决于局部变量。如果将局部变量分配给全局范围,则在全局范围无效之前不会销毁它。

例如,你有一个像(只是伪)

的实例类
    class A {

    }

    class B {
    A a;

    public B() {

    }

    public void init(){
      A a = new A();
      this.a = a;
    }

    public void destroyA() {
      this.a = null;
    }

    }

    class C {
     B b;

    public C(){
       this.b = new B();
       b.init();
    }
  }

我们正在创建一个局部变量A并为其分配全局引用,因此即使在执行init之后它也会保存引用。一旦调用了destoryA(),引用就会无效。