java - 垃圾多久收集一次?我认为我的对象没有被删除

标签 java methods garbage-collection android-view execution

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

最佳答案

当然不是。

只有当方法返回、抛出异常或线程被中止时,它才会“停止执行”。

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

关于java - 垃圾多久收集一次?我认为我的对象没有被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926966/

相关文章:

java - 在 servlet 之间共享配置参数

Java链类

java - java编程中方法的声明

java - 谁能解释一下为什么我们使用 "final AtomicInteger count = this.count;",以及为什么使用关键字final

c# - 线程创建范围和垃圾收集器

java - 将Java代码转换为C++

java - 在 GridBagLayout 中链接 2 个单元格

java - Firebase crashlytics 仪表板不断加载

memory - F# 中旅行商的表现

Java 在释放对象和垃圾回收后仍然使用系统内存