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
实例的引用链,则后者将在前者存在的时间内保持不变