1

我对这种情况是否危险感到有些困惑:

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

由于现在对该对象的唯一引用已经消失,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
  }
}

关于这种情况和/或做法的任何意见?

提前致谢

4

4 回答 4

2

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

当您执行属于某个对象的方法时,对象本身总是可以使用this引用(存储在线程执行堆栈中)被线程访问,因此它不能被垃圾收集。如果没有其他对它的引用,则当线程退出该方法时,该对象可能会被 gc'd。

于 2013-09-26T08:45:13.250 回答
1

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

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

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

于 2013-09-26T08:58:45.287 回答
0

这种解释它

但是接受的答案没有考虑回调问题。但是有评论表明 THIS 引用也算作有效引用....但是它何时失效并打开垃圾收集?

于 2013-09-26T08:45:12.853 回答
0

在执行 event() 方法时,您确实有对 OrgObject (mObject) 的引用。它被称为this。所以不,GC 不会收集你的对象。此外,如果它收集“执行”类,那就太奇怪了。你不觉得吗?

于 2013-09-26T08:45:46.473 回答