此Java代码中有多少对象符合垃圾收集条件?
根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件 有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中此Java代码中有多少对象符合垃圾收集条件?,java,collections,garbage-collection,garbage,Java,Collections,Garbage Collection,Garbage,根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件 有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中 class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null;
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1 = null;
// do Stuff
}
}
是的,答案是“在“//do stuff”行之后,有两个对象可以用于垃圾收集,但我仍然不明白为什么
在这张图片中,它也说明了为什么答案是2,但是解释让我更加困惑 它甚至不能解释其他物体发生了什么
编辑: 所以根据你们的说法,C1和C3符合GC的条件,我可以理解为什么C1被设置为null,而C1.GO(C2)将null返回给C3
但是根据这本书,只有C1是合格的,答案是2,因为包装很短。我不知道这是为什么,甚至不知道什么是短包装器对象。c2仍然在引用carboard对象。c1被设置为null,当我们调用c1.go(c2)时,c3引用的是null。
因此,它们(c1和c3)都不再在内存中引用,并且符合垃圾收集的条件。我已经运行并调试了代码,我可以看到c1和c3都为空(出于明显的原因),而c2才是空的!=空
这是因为Java中的对象是通过value()传递的,在方法中设置c2=null不会导致原始c2设置为null。我认为正确的答案实际上是只有一个对象符合“//do stuff”行之后的垃圾收集条件 在该代码中,只创建了两个对象,然后c1和c2引用它们。在“c1=null”行之后,一个对象立即成为GC的合格对象,尽管第二个对象仍然可以通过c2 ref访问 更新:
我错过了一个细节-每次调用
newcardboard()
都会创建两个对象,因此调用c1=null
会生成符合条件的CardBoard和他为GC嵌套的短成员,但c3应该设置为null,因为c1.go(c2)返回null,对吗?很抱歉,是的,你是对的,我标记错误。这就是我刚才想要键入的内容:)c2没有设置为null,go()的cb
参数设置为null,但为什么它只说c1为null加上短包装器呢?我仍然很困惑。c1是空的,因为最终空被分配给c1;c3为null,因为c1.go(c2)将null返回给c3;c2不为null,因为对其对象的c2引用被传递给go()函数中的参数cb,但c2本身并没有赋值给null,而只赋值给go()函数中的参数cb;我同意你的观点,我忽略了只有两个硬纸板对象被实例化,c3=c1。go(c2)不会实例化任何新对象。因此,在本例中,当到达//dostuff时,c1==null,因此它将可用于垃圾收集(这是一个对象),这意味着c1中的Short story=200将可用于垃圾收集(这是第二个对象)。实际上,我也错了。这里有正确的解释@Alexey哇,我不知道这个纸板问题已经被问过了。很抱歉我不知道如何检查一个已经被询问过的完整代码。Short
成员可能有资格也可能没有资格获得GC。所以正确的答案是我们不知道。实际上,在//do stuff
之后,所有对象都符合GC的条件。