Dalvik JVM垃圾会收集一个未引用的对象,我在其中执行代码并处理成员吗?

时间:2013-09-26 08:39:52

标签: java android garbage-collection dalvik

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

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

由于现在对该对象的唯一引用已经消失,即使我在事件处理程序中执行剩余的东西,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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

This sort of explains it

但是接受的答案并未考虑回调问题。但是一条评论表明THIS引用也算作一个有效的引用....但是什么时候这个无效并且开放用于垃圾收集?

答案 3 :(得分:0)

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