繁体   English   中英

在什么行可以将此对象视为垃圾回收。 爪哇

[英]At what line can this object be considered to be garbage collected. Java

因此,我的理解是在第1行,创建了一个新对象,它由obj引用。 在第2行,obj引用了另一个新对象。 因此我们在第1行创建的对象可以进行垃圾回收,因为任何实例均未引用该对象。 但是测试问题的答案在第3行。原因? 答案正确吗?

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

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

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

  • 积极的死代码消除可以消除第一个对象分配,因为它从不可见
  • 修改后的对象类(例如,通过字节码检测或引导程序类加载器)可以在完成时恢复自身,或者无限期保留其他引用
  • 垃圾回收是异步的,并且将来会在不确定的时间发生,因此,尽管从Java代码中无法访问对象,但在实际进行垃圾回收之前,不能“考虑”垃圾回收。
    它最终可能会显示在堆转储中,如果它包含安全敏感的数据,则可能是相关的

我知道这应该是一个带有简单答案的学术性问题,但是有很多假设可以使我可以对想要存在的任何答案进行法律裁决。

即使我们没有从帽子中拉出任何兔子,答案仍将取决于“在第X行”是指执行该命令之前还是之后

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM