我已经在线阅读了一些
Java垃圾回收指南,但是我仍然有点不清楚,并且要确保我的代码中没有内存泄漏.
Java GC是否收集失去引用的对象,但其变量仍然有引用?
所以让我们说SomeObject:
public class SomeObject { public ObjectVar var; public SomeObject() { var = new ObjectVar(); } }
和我的代码:
SomeObject obj1 = new SomeObject(); SomeObject obj2 = new SomeObject(); obj2.var = obj1.var; obj1 = null;
所以obj1的var有引用,但是obj1不再有任何引用.那么GC会毁坏obj1,但是保持var还活着吗? (我假设如此;只是想确保).谢谢!
解决方法
这将是会发生什么(见下面的评论)
// obj1 and obj1.var get created SomeObject obj1 = new SomeObject(); // obj2 and obj2.var get created SomeObject obj2 = new SomeObject(); // old obj2.var becomes eligible for GC obj2.var = obj1.var; // obj1 becomes eligible for GC obj1 = null;
最后,仍然有两个对象不会得到GCd – obj2,而前面的obj1.var现在被引用为obj2.var.
注意:在一个特殊情况下,ObjectVar类是SomeObject的一个非静态内部类,保持对obj1.var的引用也将保留obj1.这是因为SomeObject.ObjectVar类内部有一个类型为SomeObject的隐藏变量,它引用了内部类的外部对象.