垃圾收集的频率如何?我不认为我的对象被删除了

时间:2012-08-13 00:32:23

标签: java methods garbage-collection android-view execution

如果我有一个类删除自己,它的内部方法是否应该停止执行?我有一个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对象。当我删除View时,视图管理器或任何Android应该不再指向View,我相信,当我删除B时,它的所有内部视图也应该被删除,这意味着它们不再能够通过自己的侦听器保存B指针。我只是在说这个,看看我的理解是否正确。

2 个答案:

答案 0 :(得分:7)

当然不是。

只有return s,抛出异常或线程中止时,方法才会“停止执行”。

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

答案 1 :(得分:1)

  1. 通常会有两种GC:次要(每秒左右)和主要(每小时左右,但如果你给你的VM足够的内存,它也可能是一周)。

  2. 以异步方式释放对象(在批量处理它时更有效,它有助于保持内存未碎片化)。它们不会被删除,毫秒无法访问它们。

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