我已经在线阅读了一些 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
,它引用内部类的外部对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)