如果实例变量还有引用,Java GC是否会销毁对象?

前端之家收集整理的这篇文章主要介绍了如果实例变量还有引用,Java GC是否会销毁对象?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经在线阅读了一些 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的隐藏变量,它引用了内部类的外部对象.

猜你在找的Java相关文章