我对这种情况是否危险感到有些困惑:
我有一个对象,其中包含对回调侦听器的引用。在对象中的某个事件处,将调用回调侦听器。然后,抽象回调函数的实现将删除对我的对象的唯一现有引用。当回调返回时,我在事件处理程序中执行其他操作,也可能操纵成员。
由于现在对该对象的唯一引用已经消失,即使我在事件处理程序中执行剩余的东西,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
}
}
关于这种情况和/或做法的任何意见?
提前致谢
答案 0 :(得分:2)
没有;正在运行的线程可访问的对象不符合垃圾回收的条件。
当您执行属于某个对象的方法时,该对象本身始终可以使用this
引用(存储在线程执行堆栈中)访问该线程,因此无法进行垃圾回收。当线程退出方法时,如果没有其他对它的引用,该对象可能是gc'd。
答案 1 :(得分:1)
在任何时候,现在或将来任何线程都可以访问的任何内容都不会被垃圾回收。
更具体和非常简化的是这个过程:垃圾收集器以静态字段和自动变量开始,包括隐式“this”变量。从那里它可以找到所有(间接)可访问的内容,包括从内部类到外部类的隐式引用。然后最终确定并删除未找到的所有内容。
因此,当您的event()方法正在执行时,会找到一个隐式的自动'this'变量,并且您的OrgObject不会被垃圾回收。
答案 2 :(得分:0)
但是接受的答案并未考虑回调问题。但是一条评论表明THIS引用也算作一个有效的引用....但是什么时候这个无效并且开放用于垃圾收集?
答案 3 :(得分:0)
当event()方法正在执行时,你确实有对OrgObject(mObject)的引用。它被称为this
。所以不,GC不会收集你的对象。此外,如果它收集“执行”类,那将是相当古怪的。你不觉得吗?