假设您有一个A类实例。是否可以创建B类实例b,这样当垃圾收集时b将被垃圾收集?
我知道可以作弊并在b中创建对a的引用,所以必须等待b或其他东西。我想要的是例如在自然被删除时删除b。
答案 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运行时不需要)。