如果实例变量仍然有引用,Java GC 会销毁对象吗?

2024-01-06

我已经在线阅读了一些 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(使用前将#替换为@)

如果实例变量仍然有引用,Java GC 会销毁对象吗? 的相关文章

随机推荐