如果仍然引用对象的属性之一,是否将其保留在内存中?

时间:2018-10-03 19:41:29

标签: java memory memory-leaks

可以说有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但是一个属性是一个很小的对象。

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超出范围,但由于其属性之一仍在内存中,因此我不确定是否会保留在内存中。

1 个答案:

答案 0 :(得分:4)

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

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

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