所以我的理解是在第1行,创建了一个新对象,它被obj引用。在第2行,obj引用了另一个新对象。因此,我们在第1行创建的对象有资格进行垃圾回收,因为它没有被任何实例引用。但是测试题的答案在第三行。原因是什么?答案正确吗?
Object obj = new Object(); //line 1
obj = new Object(); //line 2
obj = null; //3Edit:它询问在第1行创建的对象何时有资格进行垃圾回收。
发布于 2015-01-23 04:07:14
在现实世界中,这个问题(正如标题所提出的)没有明确的答案。
毕竟,它可能会出现在堆转储中,如果它包含安全敏感的数据,这可能是相关的。
我知道这应该是一个学术问题,有一个简单的答案,但有太多的假设要做,所以我可以裁决-律师你想要的任何答案成为现实。
即使我们没有从帽子里拿出任何东西,答案仍然取决于“在X行”是指在执行之前还是之后。
发布于 2015-01-23 03:09:34
垃圾收集器正在检查活动对象,并丢弃任何不活动的对象。当您创建obj时,您定义它的类型,因为这允许编译器知道为该地址分配多少空间,因为那里将存在一些Type Object。当第二行代码执行时,new创建一个全新的对象实例,您将其地址分配给obj。因此,在重新分配obj以引用新对象后,旧对象仍然存在,但不再被引用。它可能会被标记为要收集,因为它占用了堆中的空间,但不再处于活动状态。第3行也是如此,除非如前所述,您为它分配了一个地址null,并且没有创建任何新对象。因此,以前被obj引用的对象现在都是死对象,垃圾工会把它们取走。
https://stackoverflow.com/questions/28096574
复制相似问题