我无法理解这里发生的事情
public class UnderstandGC {
public class Inner1
{
String name=new Inner2().name;
public void finalize()
{
System.out.println("Inner1 -> I am Dead");
}
}
public class Inner2
{
public String name="Inner2";
public void finalize()
{
System.out.println("Inner2 -> I am Dead");
}
}
public void finalize()
{
System.out.println("Main -> I am Dead");
}
public static void main(String[] args) {
UnderstandGC ugc=new UnderstandGC();
Inner1 inner1=ugc.new Inner1();
//System.out.println("hello"); //1
Runtime.getRuntime().gc();
}
}
预期产量:
在Inner1中实例化为字段引用的Inner2的Inner2 -> I am Dead
bcoz对象没有来自主线程运行时堆栈的本地引用。
观察到的输出:没有
有趣的观察是,如果我在我的代码中包含评论//1
,它可以正常工作。无法理解发生了什么。
答案 0 :(得分:1)
答案 1 :(得分:0)
通过添加以下
进行测试 Runtime.getRuntime().gc();
for(int i=0;i<25000;i++){
}
在我的JVM上,循环上任何小于25000的东西,都没有调用gc,它似乎甚至没有给JVM调用gc的机会,即使它也是如此。我推测,在应用程序结束之前,System.out.println给JVM足够的时间来调用gc(再次,只有在需要的时候才能保证)。