删除对象和所有依赖对象

时间:2013-03-18 02:52:19

标签: java object garbage-collection

我有一些自定义对象,如:

public class House
{
    private Roof r;
    private Wall w;
    private Floor f;

    public House()
    {
        this.r = new Roof();
        this.w = new Wall();
        this.f = new Floor();
    }
}

然后我创建了一个House对象的新实例:

public static void main()
{
    House h = new House();
}

所以,现在我有四个对象:

  • House h
  • 屋顶r
  • 墙w
  • 楼层f

Roof r,Wall w和Floor f绝对取决于House。

因此,如果我要删除House h,我也希望将其删除。

这样做的正确方法是什么?


如果我将此方法添加到House类:

,该怎么办?
public void remove()
{
    this.r = null;
    this.w = null;
    this.f = null;
}

当我需要移除所有组件的h之后写:

public static void main()
{
    h.remove();
    h = null;
}

我认为这应该有效,但不确定。

另外,也许有更好的方法?

是的,公共场所,旅馆等都没有。)

3 个答案:

答案 0 :(得分:1)

你永远不能依赖垃圾收集。即使您致电System.gc(),也无法保证它会做任何事情。当系统决定运行垃圾收集时,可能会收集无法访问的引用,但如果运行小型应用程序,收集器可能永远不会运行。

如果您需要在处理对象时收到通知,则应使用java.lang.ref.PhantomReferencejava.lang.ref.ReferenceQueue。不要依赖Object.finalize()。但这似乎不是你的问题;你只想自己清理一下。您应该只关心应用程序的性能是否需要它。

答案 1 :(得分:0)

您不需要在House中清空所有实例变量,因为当没有对House实例的引用时,它们会自动进行垃圾回收。

  

如果他们 从其他地方引用怎么办?但我希望删除“父”对象删除它们。

为此,每次从House类之外的某个位置引用对象时,都应使用weak references。这样,当不再引用House时,对象将被垃圾收集,因为指向它们的唯一强引用位于House内。

答案 2 :(得分:-1)

您提供的解决方案几乎是正确的。一旦将对象引用标记为null,那么每当垃圾收集器开始运行时,JVM垃圾收集器将销毁该对象并将其从内存中删除。

您还可以在将引用变量设置为NULL后手动指示垃圾收集器收集垃圾。