2

如果我有一个类自己删除,它的内部方法是否应该停止执行?我有一个 B 类,它告诉 A 类从 A 的 ArrayList 中删除 B。我相当肯定 B 只存在于 A 的 ArrayList 中,所以当我删除它时,它应该被删除,对吗?(注意:我已经包含了一个 Serializable 实现,以防万一这与 VM 如何处理我的类有关,但我没有在此处编写 read- 和 writeObject 方法。我怀疑它与不过这个问题。)

public class A implements Serializable, B_Listener {
    ArrayList<B> bArray;

    public A() {
        bArray = new ArrayList<SomeObject>();
        bArray.add(new B(bArray.size(), this));
    }

    @Override
    public void deleteAtIndex(int index) {
        bArray.remove(index);
    }
}

public class B implements Serializable {
    B_Listener listener;
    int index;

    public B(B_Listener listener, int index) {
        this.listener = listener;
        this.index = index;
    }

    //This is called at some point in a B's lifetime.
    private void selfDestruct() {
        listener.deleteAtIndex(index);
        Log.w("B.class", "Should this not output? It does.");
    }
}

public interface B_Listener {
    public void deleteAtIndex(int index);
}

所以当我不相信它应该执行 Log.w 消息时。因此,恐怕我正在创建 java 的内存泄漏。我查看并查看了整个代码,试图找到 B 可能被指针保存的位置,但除了我想要的之外,我什么也没想到。

那么我问垃圾收集的时间是否与我最终删除 B 的时间不同。如果是这种情况,那么暂时可以肯定地说我实际上并没有持有我不打算持有的物体吗?

额外的(注意:这可能很难理解,上面的所有内容都应该足以解决问题):我也用 Android-Views 标记了这个,因为我正在 Android 上开发:我的 B 类包含指向 B 的 View 对象听众。我相信当我删除视图时,视图管理器或任何 Android 都不应再指向视图,当我删除 B 时,它的所有内部视图也应该被删除,这意味着它们不能再通过自己的侦听器来保持 B 的存在指针。我只是说出来看看我的理解是否正确。

4

2 回答 2

7

当然不是。

一个方法只会“停止执行”,如果它return是,如果抛出异常,或者如果线程被中止。

垃圾收集的全部意义在于它对您是不可见的。除非有特殊技巧(例如 WeakReferences,或检查空闲内存),否则无法判断一个对象是否已被垃圾回收 - 如果您可以检查它是否存在,则意味着您有对它的引用,因此无法收集它.

于 2012-08-13T00:37:32.537 回答
1
  1. 通常会有两种 GC:minor(每隔一秒左右)和 major(每隔一小时左右,但如果你给你的 VM 足够的内存,它也可能是一周)。

  2. 对象以异步方式释放(批量执行此操作更有效,并且有助于保持内存不碎片化)。它们不会在它们不可访问的毫秒内被删除。

  3. 垃圾收集只有在没有活动线程能够访问对象时才有意义,而不是在没有对象持有对它的引用时才有意义。在您的代码中,只要 selfDestruct 运行,线程就拥有一个隐式的“this”引用。这实际上导致对象被线程引用 - 并且不受 GC 影响。

于 2012-08-13T00:46:54.057 回答