在给定的程序中,垃圾收集器在对象被解除引用之前运行...使用jre 7(32位)

时间:2014-07-14 13:19:39

标签: java garbage-collection

enter image description here

class Robot
{
long memory[] = new long[9923372];

private String name;

Robot(String nm) throws Exception
{
name = nm;
System.out.println("name = " + name);
}

protected void finalize()
{
System.out.println("\nBye - Bye ---eeeee " + name+"\n");
}

}


class Test
{

public static void main(String sdf[]) throws Exception
{
int i=1;
Robot robot1;


while(true)
{
//finalizer runs before the dereference of rajni - 1
robot1= new Robot("Rajni - "+i++);
Thread.sleep(1000);
}

}
}

如何在从rajni1第一个对象中删除robot1之前运行终结器... 循环在无限循环中运行......

我知道垃圾收集器会在堆空间不足时运行,并且对象分配需要更多内存......但条件是必须有一些解除引用的对象驻留在内存中.....

--->在jre 32位运行以获得给定的输出...你最好知道为什么??

1 个答案:

答案 0 :(得分:2)

现在提供输出更清楚了。

您可以查看已编译的字节代码以了解原因。

  public static main([Ljava/lang/String;)V throws java/lang/Exception 
   L0
    LINENUMBER 48 L0
    ICONST_1
    ISTORE 1
   L1
    LINENUMBER 54 L1
   FRAME APPEND [I]
    NEW Main$Robot
    DUP
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    LDC "Rajni - "
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ILOAD 1
    IINC 1 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    INVOKESPECIAL Main$Robot.<init> (Ljava/lang/String;)V
    ASTORE 2
   L2
    LINENUMBER 55 L2
    LDC 1000
    INVOKESTATIC java/lang/Thread.sleep (J)V
    GOTO L1
   L3
    LOCALVARIABLE sdf [Ljava/lang/String; L0 L3 0
    LOCALVARIABLE i I L1 L3 1
    LOCALVARIABLE robot1 LMain$Robot; L2 L3 2
    MAXSTACK = 4
    MAXLOCALS = 3

要注意的重要一行是robot1变量的范围,该变量介于L2L3之间,即仅在Thread.sleep(1000);期间且局部变量超出范围一旦循环跳回L1

这意味着现实中的变量可以在循环顶部进行GC编辑,而不是在您创建新机器人之后进行GC编辑。