当在如下所示的类中执行i3 = null;时,有四个对象有资格进行垃圾回收。我添加了一些注释来解释我是如何得到这个答案的。我的推理正确吗?
public class Icelandic extends Horse{
public void makeNoise(){
System.out.println("vinny");
}
public static void main(String args[]){
/**
* 2 objects created
*/
Icelandic i1 = new Icelandic();
/**
* 2 objects created
*/
Icelandic i2 = new Icelandic();
/**
* 2 objects created
*/
Icelandic i3 = new Icelandic();
/**
* i3 is now pointing at i1, original Icelandic() referred to by i3 now
* has no reference - 2 objects now have no reference
*/
i3 = i1;
/**
* i3 is now pointing at i1, original Icelandic() referred to by i1 now
* has no reference - 2 objects now have no reference
*/
i1 = i2;
/**
* Total of six objects created, 4 objects no longer have a reference so 4
* can be garbage collected.
*
* Setting to null below doesn't make any difference to garbage collector
* as objects now do not have a reference
*/
i2 = null;
i3 = null;
}
}
interface Animal {
void makeNoise();
}
class Horse implements Animal{
Long weight = 1200L;
public void makeNoise() {
System.out.println("whinny");
}
}发布于 2011-11-26 00:49:09
以下是您的程序的步骤:
Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic();

i3 = i1;
i1 = i2;

i2 = null;
i3 = null;

因此,最后一个图表得出结论,只有2个对象准备好进行垃圾回收。我希望我说得够清楚了。您可以将对象名称视为对对象的引用。
编辑:
正如BalusC所说,Long weight = 1200L也是对象。因此,i1和i3各有两个对象是合格的或垃圾回收。因此,在所有4个对象都是合格的或垃圾回收。
发布于 2011-11-26 01:21:27
作为一个非常简单的经验法则,如果java中的对象的所有字段都被复制到局部变量(优化程序转换),并且对该对象的所有引用都被设置为null,则该对象可以被垃圾回收。
引用“Java VM规范”
12.6.1实现终结化每个对象都可以由两个属性表征:它可以是可达的、终结器可达的或不可达的,也可以是未完成的、可终结化的或已完成的。
可达对象是可以在任何活动线程的任何潜在连续计算中访问的任何对象。程序的优化转换可以被设计为将可到达的对象的数量减少到少于那些天真地被认为是可到达的对象的数量。例如,编译器或代码生成器可以选择将不再用于null的变量或参数设置为null,以使得这样的对象的存储可能更快地可回收。
讨论
如果对象的字段中的值存储在寄存器中,则会发生另一个示例。然后,程序可以访问寄存器而不是对象,并且再也不会访问对象。这将意味着该对象是垃圾。
因此,在您的例子中,由于对任何Icelandic对象的引用都没有被解除引用,所有这些引用都可能立即被垃圾回收。由于没有任何东西解除i1对i3的引用,优化编译器可以自由地将i3 = new Icelandic()之后的所有内容省略为无操作,并立即收集所有六个对象。
https://stackoverflow.com/questions/8271895
复制相似问题