Java 如果对象的某个属性仍被引用,该对象是否保留在内存中?

Java 如果对象的某个属性仍被引用,该对象是否保留在内存中?,java,memory,memory-leaks,Java,Memory,Memory Leaks,假设有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但其中一个属性是一个非常小的对象 class HugeObject { private HugeObject1 x1; private HugeObject2 x2; : : private HugeObject1000 x1000; private SmallObject1 s1; public SmallObject1 getSmallObject()

假设有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但其中一个属性是一个非常小的对象

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

   public SmallObject1 getSmallObject()
   {
       return s1;
   }
}
下面的代码片段将基于小对象(
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
超出范围,我也不确定它是否会保留在内存中,因为它的一个属性仍在内存中

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

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

如果有一个从
SmallObject
实例到
HugeObject
实例的引用链,则后者将在前者存在的时间内保持不变