This question already has answers here:
What happens when an object is dereferenced but its member object is still referenced?
(3个答案)
2年前关闭。
可以说有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但是一个属性是一个很小的对象。
以下代码段将基于小对象(
是这种情况,只是
即使
(3个答案)
2年前关闭。
可以说有一个巨大的对象,其中包含大量其他巨大的对象作为其属性,但是一个属性是一个很小的对象。
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
不在范围内,我也不确定它是否会保留在内存中,因为它的属性之一仍在内存中。 最佳答案
只要不保留对HugeObject
实例的引用,它将可以进行垃圾回收。但这并不意味着它将立即被垃圾回收(取决于JVM)。
需要注意的一件事是从SmallObject
实例回到HugeObject
实例的引用(可能是间接的)。例如,如果SmallObject
是HugeObject
的内部类,则可能会发生这种情况。 (This article详细解释了机制。)
如果存在从SmallObject
实例到HugeObject
实例的引用链,则只要存在前者,后者就将一直存在。
07-24 20:08