首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在哪一行,这个对象可以被认为是垃圾回收。Java

在哪一行,这个对象可以被认为是垃圾回收。Java
EN

Stack Overflow用户
提问于 2015-01-23 02:56:03
回答 2查看 117关注 0票数 0

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

代码语言:javascript
复制
Object obj = new Object();  //line 1
obj = new Object();  //line 2
obj = null;  //3

Edit:它询问在第1行创建的对象何时有资格进行垃圾回收。

EN

回答 2

Stack Overflow用户

发布于 2015-01-23 04:07:14

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

  • 激进的死代码消除可以消除第一个对象分配,因为它永远不会变得可见
  • 修改的对象类(例如,通过字节码工具或引导类加载器)可能会在完成时恢复自身,或者保留额外的引用indefinitely
  • garbage收集是异步的,并且在未来的某个不确定的时间点发生,所以虽然一个对象可能无法从java代码中访问,但在它实际被垃圾收集之前,它不能被“视为”垃圾收集。

毕竟,它可能会出现在堆转储中,如果它包含安全敏感的数据,这可能是相关的。

我知道这应该是一个学术问题,有一个简单的答案,但有太多的假设要做,所以我可以裁决-律师你想要的任何答案成为现实。

即使我们没有从帽子里拿出任何东西,答案仍然取决于“在X行”是指在执行之前还是之后。

票数 0
EN

Stack Overflow用户

发布于 2015-01-23 03:09:34

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28096574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档