java垃圾收集:对未引用对象的引用';s成员对象

java垃圾收集:对未引用对象的引用';s成员对象,java,garbage-collection,Java,Garbage Collection,假设我们有一个类: public class test{ public String member; public test() { member = new String("internal object"); } }; 如果我这样写: String refToUnreferencedClassMember = new test().member; 这有问题吗?未引用的对象newtest()没有指向自身的引用,但有一个指向其成员对象字符串成员

假设我们有一个类:

public class test{
    public String member;
    public test()
    {
        member = new String("internal object");
    }
};
如果我这样写:

String refToUnreferencedClassMember = new test().member;
这有问题吗?未引用的对象
newtest()
没有指向自身的引用,但有一个指向其成员对象
字符串成员的引用。如果未引用的对象被垃圾收集,则
refToUnreferencedClassMember
将无效


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

在这种特殊情况下

new test().member;
将指向java heapspace中的
字符串
对象

现在,当您将其分配给

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


请注意,测试对象将符合GC的条件。当匿名
new test()
对象是GC'd时,您的字符串对象仍将有一个引用,即
refToUnreferencedClassMember
,因此在这种特殊情况下不允许它是GC'd。

new test().member;
将指向java heapspace中的
字符串
对象

现在,当您将其分配给

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

请注意,测试对象将符合GC的条件。当匿名
new test()
对象是GC'd时,您的字符串对象仍将保留一个引用,即
refToUnreferencedClassMember
,因此不允许对其进行GC'd

这有问题吗

没有

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

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

不,不会,除非它没有被引用。当您的示例中引用它时,问题消失了

这有问题吗

没有

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

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


不,不会,除非它没有被引用。在您的示例中引用该字段时,问题消失。

该字段不了解该封闭对象

因此,封闭对象可以立即被垃圾收集

该字符串将一直保留,直到对它的引用消失


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

该字段没有关于该封闭对象的知识

因此,封闭对象可以立即被垃圾收集

该字符串将一直保留,直到对它的引用消失


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

我想打这个电话应该没问题。即使当
newtest()
-对象被垃圾收集时,字符串也不应该更改,因为值被复制(请参阅:按值调用与按引用调用)。但我不专业,所以有人应该证实这一点。否,
refToUnreferencedClassMember
不会无效。该对象从新的test()对象和refToUnreferencedClassMember引用。当新的测试GC仍然存在时,字符串对象将处于活动状态。我认为执行此调用应该不会有任何问题。即使当
newtest()
-对象被垃圾收集时,字符串也不应该更改,因为值被复制(请参阅:按值调用与按引用调用)。但我不专业,所以有人应该证实这一点。否,
refToUnreferencedClassMember
不会无效。该对象从新的test()对象和refToUnreferencedClassMember引用。当新的测试GC仍然存在时,字符串对象将处于活动状态。请注意,
String
对象也会发生同样的情况。表示文本
“内部对象”
字符串
实例和通过
新字符串(“内部对象”)
显式创建的实例都将指向包含实际字符内容的相同数组。只要对这两个实例中至少一个实例的引用存在,数组就会一直存在。请注意,
字符串
对象也会出现同样的情况。表示文本
“内部对象”
字符串
实例和通过
新字符串(“内部对象”)
显式创建的实例都将指向包含实际字符内容的相同数组。只要存在对这两个实例中至少一个实例的引用,该数组就会一直存在。