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位运行以获得给定的输出...你最好知道为什么??
答案 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
变量的范围,该变量介于L2
和L3
之间,即仅在Thread.sleep(1000);
期间且局部变量超出范围一旦循环跳回L1
这意味着现实中的变量可以在循环顶部进行GC编辑,而不是在您创建新机器人之后进行GC编辑。