加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如果实例变量还有引用,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的隐藏变量,它引用了内部类的外部对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读