在什么线上可以认为该对象是垃圾收集的。 Java的

时间:2015-01-22 18:56:03

标签: java garbage-collection

所以我的理解是在第1行,创建了一个新对象,它被obj引用。在第2行,obj引用另一个新对象。所以我们在第1行创建的对象有资格进行垃圾收集,因为它没有被任何实例引用。但测试问题的答案是第3行。原因?答案是否正确?

Object obj = new Object();  //line 1
obj = new Object();  //line 2
obj = null;  //3

编辑:它询问第1行创建的对象何时可以进行垃圾回收。

2 个答案:

答案 0 :(得分:0)

在现实世界中,这个问题(由标题提出)没有明确的答案。

  • 积极的死代码消除可以消除第一个对象分配,因为它永远不会变得可见
  • 修改后的对象类(例如通过字节码检测或引导类加载器)可以在最终确定时复活或无限期地保留其他引用
  • 垃圾收集是异步的,并且在未来的某个不确定点发生,所以虽然对象可能无法从java代码中访问,但它不能被认为是#34;垃圾收集,直到它实际上已被垃圾收集。
    它毕竟可能出现在堆转储中,如果它包含安全敏感数据可能是相关的

我知道这应该是一个简单回答的学术问题,但是有很多假设可以让我可以为你提供任何你想要的答案。

即使我们不把任何兔子拉出帽子,答案仍然取决于是否在第X"指在执行

之前或之后

答案 1 :(得分:-2)

垃圾收集器正在检查实时对象并丢弃任何不存在的对象。当您创建obj时,您可以定义它的类型,因为这样可以让编译器知道为该地址分配多少空间,因为那里会存在Type Object。当第二行执行时,new正在创建一个全新的对象实例,并且您将其地址分配给obj。因此,在重新分配obj以引用新对象之后,旧对象仍然存在,但不再被引用。它可能会被标记为集合,因为它占用堆中的空间,但不再处于活动状态。第3行也是如此,除非如前所述,您为其分配了null的地址,并且没有创建新对象。因此,obj过去引用的内容现在已经是死对象而垃圾人将它们带走了。