Dalvik JVM是否会垃圾收集我在其中执行代码和处理成员的非引用对象



我对这种情况是否危险有点困惑:

我有一个对象,其中包含对回调侦听器的引用。在对象中的某个事件中,将调用回调侦听器。然后,抽象回调函数的实现将删除对 my 对象的唯一现有引用。当回调返回时,我在事件处理程序中执行其他操作,并且还可以操作成员。

由于现在对此对象的唯一引用已经消失,即使我在事件处理程序中执行其余操作,Dalvik JVM 垃圾收集器也会尝试垃圾回收我的对象吗?这将产生什么后果?

写了一些简单且相当无用的代码来说明我的情况:

public SomeClass {
  public abstract class CallBackListener {
    public void abstract callback();
  }
  private CallBackListener mCb = null;
  private OrgObject mObject = null;
  public SomeClass() {
    mCb = new CallBackListener() {
      @Override
      public void callback() {
          mObject = null;
      }
    };
    mObject = new OrgObject(mCb);
  }
}
public class OrgObject {
  private SomeClass.CallBackListener mCb = null;
  public OrgObject(SomeClass.CallBackListener cb) {
    mCb = cp;
  }
  public void event() {
    //call callback
    cb.callback();
    //do other stuff
  }
}

对这种情况和/或做法有什么意见吗?

提前致谢

否;正在运行的线程可访问的对象不符合垃圾回收的条件。

在执行属于对象的方法时,线程始终可以使用this引用(存储在线程执行堆栈上)访问对象本身,因此不能对其进行垃圾回收。当线程退出该方法时,如果没有其他对对象的引用,则该对象可能是 gc'd。

在任何时候,任何线程现在或将来可能访问的任何内容都不会被垃圾回收。

更具体,非常简化的过程是:垃圾回收器从静态字段和自动变量开始,包括隐式的"this"变量。从那里,它找到从这些类(间接)访问的所有内容,包括从内部类到外部类的隐式引用。然后,未找到的所有内容都将最终确定并删除。

因此,当您的event()方法正在执行时,会找到一个隐式的自动"this"变量,并且您的OrgObject不会被垃圾回收。

这解释了它

但是接受的答案没有考虑回调问题。但有评论表明,这个参考也算作一个有效的参考......但是什么时候无效并开放进行垃圾收集?

当 event() 方法正在执行时,您确实有对 OrgObject (mObject) 的引用。它被称为this.所以不,GC 不会收集您的对象。此外,如果它收集"执行"类,那将是相当奇怪的。你不觉得吗?

最新更新