在《Java编程思想》一书中,作者提供了一种强制回收对象的技巧。我写了一个类似的程序来测试它(我的环境是Open JDK 7):
然而,如果我将主函数的第一行修改为以下内容:
//forcing the garbage collector to call the finalize method
class PrintMessage
{
private String message;
public PrintMessage (String m)
{
this.message = m;
}
public String getMessage()
{
return this.message;
}
protected void finalize()
{
if(this.message == ":P")
{
System.out.println("Error. Message is: " + this.message);
}
}
}
public class ForcingFinalize
{
public static void main(String[] args)
{
System.out.println((new PrintMessage(":P")).getMessage());
System.gc();
}
}
我认为关键是创建一个新的对象引用而不是赋值:new PrintMessage();
。
以下是让我感到困惑的地方。当我编译并运行此程序时,我得到了以下预期输出:
:P
Error. Message is: :P
然而,如果我将主函数的第一行修改为以下内容:
(new PrintMessage(":P")).getMessage();
我没有看到任何输出。为什么只有当我将输出发送到标准输出时,System.gc()
才调用垃圾收集器?这是否意味着JVM只有在看到某些“真正”的用途时才创建对象?
Thread.sleep()
后它可以工作了。 :-) - ankush981