Java垃圾回收:对未引用对象的成员对象的引用

时间:2018-07-22 10:07:55

标签: java garbage-collection

假设我们有一个课程:

public class test{
    public String member;
    public test()
    {
        member = new String("internal object");
    }
};

如果我写了这个:

String refToUnreferencedClassMember = new test().member;

这有问题吗?未引用对象new test()没有指向其自身的引用,但是存在指向其成员对象String member的引用。如果未引用的对象是垃圾回收,则refToUnreferencedClassMember将无效。

感谢您的帮助。我不知道在这种情况下是否会进行垃圾收集。

3 个答案:

答案 0 :(得分:3)

在这种情况下,

new test().member;

将指向Java堆空间中的String对象。

现在将其分配给

refToUnreferencedClassMember 

然后,String对象将具有两个引用,即一个通过匿名new test()对象,另一个通过 refToUnreferencedClassMember 。。 >

请注意,测试对象将有资格使用GC。而且,当匿名new test()对象被GC'd时,您的字符串对象仍将剩下一个引用,即refToUnreferencedClassMember,因此不允许对其进行GC'd。

答案 1 :(得分:0)

  

这有问题吗?

否。

  

未引用的对象new test()没有指向自身的引用,但是有指向其成员对象String成员的引用。

正确。

  

如果未引用的对象被垃圾回收,则refToUnreferencedClassMember将无效。

否,除非未引用,​​否则不会。正如您的示例中所引用的那样,问题消失了。

答案 2 :(得分:0)

该字段不了解该封闭对象。

因此,封闭对象可以立即进行垃圾收集。

该字符串一直存在,直到对其的引用消失为止。

但是请注意:从面向对象的角度来看,您确实要避免公开类的可变字段。不允许其他类操纵成员的内部状态是不可以的!