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
对象也会发生同样的情况。表示文本“内部对象”
的字符串实例和通过新字符串(“内部对象”)
显式创建的实例都将指向包含实际字符内容的相同数组。只要对这两个实例中至少一个实例的引用存在,数组就会一直存在。请注意,字符串
对象也会出现同样的情况。表示文本“内部对象”
的字符串实例和通过新字符串(“内部对象”)
显式创建的实例都将指向包含实际字符内容的相同数组。只要存在对这两个实例中至少一个实例的引用,该数组就会一直存在。