在Java中,您可以链接两个类之间的垃圾收集吗?

时间:2011-04-08 16:44:14

标签: java garbage-collection

假设您有一个A类实例。是否可以创建B类实例b,这样当垃圾收集时b将被垃圾收集?

我知道可以作弊并在b中创建对a的引用,所以必须等待b或其他东西。我想要的是例如在自然被删除时删除b。

5 个答案:

答案 0 :(得分:4)

没有。你永远不能强迫任何对象被垃圾收集。这是垃圾收集的重点。

但是,如果对b的唯一引用来自a,则很可能当收集器收集a时,它也会收集b。

但说实话,如果你担心什么时候收集物品,那你就错了。就程序而言,死对象和已删除对象之间应该没有区别。您是否有特定用途要讨论这个问题?

答案 1 :(得分:1)

通常,您甚至无法确定何时收集对象(即使System.gc()无法确保收集所有未引用的对象)也需要使用垃圾收集算法来确定是否收集了未引用的对象

有几种GC策略(您可以在启动JVM时设置它),您唯一的选择是选择一个详尽的策略,以确保收集所有未引用的对象(*)。然后你必须确保a和b同时被取消引用(而且gc之间没有被调用 - 我不知道有什么方法可以确保 - )。

(*)不知道这种算法是否存在。但如果确实如此,我很确定它会对性能产生重大影响。

答案 2 :(得分:1)

是的,如果B的实例在A类内,它可能会在A被销毁时自动收集垃圾。这个例子可以这样实现:

   public class A {
`       B b;
     public A(B b) {
     this.b =b;
    }
   }

public class Test() {
  public static void main(String [] args) {
     A a = new A();
  }
}

当一个超出范围时,a和b都将被垃圾收集(一个垃圾收集中的对象b将首先被垃圾收集)。

我认为你不能为特定对象调用垃圾收集器,它会根据需要自动工作(你不能强迫它)。您可以尝试以这种方式调用它:

Runtime r = Runtime.getRuntime();
r.gc();

当你执行上面的代码时,不能保证对象会被垃圾调用(也许垃圾收集器很忙)

答案 3 :(得分:1)

您可能知道,我们不能强迫GC按照我们的愿望工作。

但是第一个可以想到的想法是,如果A包含B的实例,那么当a为GC时,b自然也是如此。这只是我想到的一个场景。我不知道你真的想怎么做。

您也可以使用weak references

答案 4 :(得分:0)

除了(非保证)调用obj.finalize()之外,最终确定对象时没有触发事件。

您可以放置​​一些代码来完成A的最终化()。如果您能够以某种方式基于对象A数据(但不保留实际引用)来扣除对象B,那么此时您可以从全局静态集中删除B,使其符合GC条件(虽然在同一GC运行时不需要)。