This question already has answers here:
What happens when an object is dereferenced but its member object is still referenced?

(3个答案)


2年前关闭。




可以说有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但是一个属性是一个很小的对象。
class HugeObject
{
   private HugeObject1 x1;
   private HugeObject2 x2;
        :
        :
   private HugeObject1000  x1000;
   private SmallObject1    s1;

   public SmallObject1 getSmallObject()
   {
       return s1;
   }
}

以下代码段将基于小对象(SmallObject1)创建一个新对象。 HugeObject例程中的runThis()超出范围,但返回了SmallObject1属性。
public class Test
{
      public static void main(String[] args)
      {
          SmallOjbect1 so = runThis();
          //Application continues to run here for a long time.

      }

      public SmallObject1 runThis()
      {
          HugeObject ho = new HugeObject();
                :
          //Do some calculations, call other procedures....

          return ho.getSmallObject();
      }
}

是这种情况,只是SmallObject1保留在内存中,还是HugeObject也保留在内存中,因为SmallObject1是其属性。

即使HugeObject不在范围内,我也不确定它是否会保留在内存中,因为它的属性之一仍在内存中。

最佳答案

只要不保留对HugeObject实例的引用,它将可以进行垃圾回收。但这并不意味着它将立即被垃圾回收(取决于JVM)。

需要注意的一件事是从SmallObject实例回到HugeObject实例的引用(可能是间接的)。例如,如果SmallObjectHugeObject的内部类,则可能会发生这种情况。 (This article详细解释了机制。)

如果存在从SmallObject实例到HugeObject实例的引用链,则只要存在前者,后者就将一直存在。

07-24 20:08