我对在方法定义中创建的对象的生命有疑问。据我所知,方法本地的所有变量的生命都以该方法的完成结束。因此,如果我在方法中创建一个对象,它将在执行该方法后被销毁。
答案 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(),引用就会无效。