为了账号安全,请及时绑定邮箱和手机立即绑定

GC 是否足够智能以删除被引用但不再使用的对象?

GC 是否足够智能以删除被引用但不再使用的对象?

慕勒3428872 2021-06-11 19:08:28
假设我有一个名为“master”的对象,它分别拥有 100 个名为“slave0”到“slave99”的对象。(这不是一个数组。我的“主”类中有 100 个字段,分别称为 salve0 到 slave99。)现在,假设我的程序首先读入一个包含“主”对象的序列化存储版本的文件。但是,假设我的程序从不使用对象 slave50 到 slave99。会发生什么?(我的猜测是,作为读取/反序列化过程的一部分,java 程序将首先读取所有 100 个从属对象,并且只有在读入所有 100 个从属对象后,它可能会选择执行 GC,此时对象 slave50 到 slave99 将被 GC 删除并回收内存。这是正确的吗?注意:对象“master”仍在使用中,因此从技术上讲,对象 slave50 到 slave99 仍在被父对象 master 引用,并且父对象 master 仍在积极使用中。)后续问题因此,假设我上面关于 GC 工作原理的猜测是正确的;如果我的长时间运行的程序花了几分钟时间处理对象 slave0 到 slave50,然后进入另一个名为“X”的最终(长时间运行)过程,该过程只处理对象 slave0 到 slave25。GC 会不会意识到即使对象 slave25 到 slave50 仍然被父对象 master 引用,并且即使对象 master 仍在使用,GC 仍然足够聪明以摆脱对象 slave25 到 slave50,因为没有人是否会从“程序 X”开始使用它?
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

在 Java 中,GC 不会删除活动对象。在查看跟踪 GC 逻辑时,当一个对象可从活动线程访问时,它被认为是活动的(除非我们正在考虑更奇特的引用类型,例如WeakReference)。在您的简单示例中,master对象中的所有字段都是可访问的,因为master对象本身可从main线程访问。

查看完整回答
反对 回复 2021-06-23
  • 2 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信