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

Jon*_*ter 1 java garbage-collection

假设我有一个名为"master"的对象,它拥有100个对象,分别称为"slave0"到"slave99".(这不是一个数组.我的"master"类中有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仍然被父对象主机引用,即使仍然使用对象主机,GC仍然足够聪明,可以通过slave50摆脱slave25,因为没有人是否会从"程序X"开始使用它?

Kar*_*cki 6

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

在跟踪GC时,您可以阅读各种文章: