我有一些自定义对象,如:
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();
}
所以,现在我有四个对象:
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;
}
我认为这应该有效,但不确定。
另外,也许有更好的方法?
是的,公共场所,旅馆等都没有。)
答案 0 :(得分:1)
你永远不能依赖垃圾收集。即使您致电System.gc()
,也无法保证它会做任何事情。当系统决定运行垃圾收集时,可能会收集无法访问的引用,但如果运行小型应用程序,收集器可能永远不会运行。
如果您需要在处理对象时收到通知,则应使用java.lang.ref.PhantomReference
和java.lang.ref.ReferenceQueue
。不要依赖Object.finalize()
。但这似乎不是你的问题;你只想自己清理一下。您应该只关心应用程序的性能是否需要它。
答案 1 :(得分:0)
您不需要在House
中清空所有实例变量,因为当没有对House
实例的引用时,它们会自动进行垃圾回收。
如果他们 从其他地方引用怎么办?但我希望删除“父”对象删除它们。
为此,每次从House
类之外的某个位置引用对象时,都应使用weak references。这样,当不再引用House
时,对象将被垃圾收集,因为指向它们的唯一强引用位于House
内。
答案 2 :(得分:-1)
您提供的解决方案几乎是正确的。一旦将对象引用标记为null,那么每当垃圾收集器开始运行时,JVM垃圾收集器将销毁该对象并将其从内存中删除。
您还可以在将引用变量设置为NULL后手动指示垃圾收集器收集垃圾。