如果实例变量仍有引用,Java GC是否会破坏对象?

bae*_*aek 15 java garbage-collection

我已经在线阅读了一些Java垃圾收集指南,但我仍然有点不清楚,并希望确保我的代码中没有内存泄漏.

Java GC是否收集丢失其引用的对象,但其变量仍有引用?

所以我想说我有SomeObject:

public class SomeObject {
    public ObjectVar var;

    public SomeObject() {
        var = new ObjectVar();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码:

SomeObject obj1 = new SomeObject();
SomeObject obj2 = new SomeObject();
obj2.var = obj1.var;
obj1 = null;
Run Code Online (Sandbox Code Playgroud)

所以obj1的var有引用,但是obj1不再有任何引用.那么,GC会破坏obj1,但保持var存活吗?(我假设是这样;只是想确定).谢谢!

das*_*ght 17

这是将要发生的事情(见下面的评论)

// 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;
Run Code Online (Sandbox Code Playgroud)

最后,还有两个没有得到GCd的对象 - obj2前者obj1.var现在被引用为obj2.var.

注意:在ObjectVar类是非静态内部类的特殊情况下SomeObject,保持引用obj1.var也会保持不变obj1.这是因为SomeObject.ObjectVar类内部有一个隐藏的类型变量SomeObject,它引用了内部类的外部对象.

  • @baekacaek ZyyaoWei的评论仅考虑静态内部类,在这种情况下它确实无关紧要.非静态内部类和匿名或命名方法本地类可以防止宿主对象被垃圾收集,但静态内部类不能. (2认同)