如果实例变量还有引用,Java GC是否会销毁对象?
发布时间:2020-12-14 16:44:14 所属栏目:Java 来源:网络整理
导读:我已经在线阅读了一些 Java垃圾回收指南,但是我仍然有点不清楚,并且要确保我的代码中没有内存泄漏. Java GC是否收集失去引用的对象,但其变量仍然有引用? 所以让我们说SomeObject: public class SomeObject { public ObjectVar var; public SomeObject() {
我已经在线阅读了一些
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的隐藏变量,它引用了内部类的外部对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |