猿问

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

假设我有一个名为“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”开始使用它?


慕勒3428872
浏览 215回答 2
2回答

慕少森

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

相关分类

Java
我要回答