可以说有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但是一个属性是一个很小的对象。
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
超出范围,但由于其属性之一仍在内存中,因此我不确定是否会保留在内存中。
答案 0 :(得分:4)
只要不保留对HugeObject
实例的引用,它就可以进行垃圾回收。这并不意味着它会立即被垃圾收集(取决于JVM)。
要注意的一件事是(可能是间接的)从SmallObject
实例返回到HugeObject
实例的引用。例如,如果SmallObject
是HugeObject
的内部类,则会发生这种情况。 (This article详细解释了这些机制。)
如果存在从SmallObject
实例到HugeObject
实例的引用链,则只要存在前者,后者就会一直存在。