【问题标题】:Is an object kept in memory if one of its attributes is still referenced? [duplicate]如果对象的其中一个属性仍然被引用,对象是否保存在内存中? [复制]
【发布时间】:2019-03-09 03:04:34
【问题描述】:

假设有一个巨大的物体,它包含大量其他巨大的物体作为它的属性,但一个属性是一个非常小的物体。

class HugeObject  
{
   private HugeObject1 x1;
   private HugeObject2 x2;
        :
        :
   private HugeObject1000  x1000;
   private SmallObject1    s1;

   public SmallObject1 getSmallObject()
   {
       return s1;
   }
}

下面的代码sn -p会根据小对象(SmallObject1)创建一个新对象。 runThis() 例程中的 HugeObject 超出范围,但返回了 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 超出范围,但我不确定它是否会保留在内存中,因为它的一个属性仍在内存中。

【问题讨论】:

    标签: java memory memory-leaks


    【解决方案1】:

    只要没有对HugeObject 实例的引用,它就会有资格进行垃圾回收。这并不意味着它会立即被垃圾回收(这取决于 JVM)。

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

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

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2022-11-30
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2023-03-03
      相关资源
      最近更新 更多