大家好,最近看孙鑫的java 12cd视频教程的时候看到第3CD中的时候(CD播放时候为:
1小时56分38秒的时候有这样一个例子如下:
class Garbage
{
int index;
static int count;
Garbage()
{
count++;
System.out.println("object  " + count + "  construct!");
setId(count);
}
void setId(int id)
{
index=id;
}
protected void finalize()
{
System.out.println("object " + index + " is reclaimed!");
}
public static void main(String[] args) 
{
new Garbage();
new Garbage();
new Garbage();
new Garbage();
System.gc();
}
}
我的输出结果为:
object  1  construct!
object  2  construct!
object  3  construct!
object  4  construct!
object 4 is reclaimed!
object 3 is reclaimed!
object 2 is reclaimed!
object 1 is reclaimed!
请按任意键继续. . .
而孙鑫的视频教程上输出为:
object  1  construct!
object  2  construct!
object  3  construct!
object  4  construct!
object 1 is reclaimed!
object 2 is reclaimed!
object 3 is reclaimed!
object 4 is reclaimed!
请按任意键继续. . .请大家看看是怎么回事呢?应该是后建立的对象先回收才对啊?我这个结果应当是正确的啊?怎么孙鑫的视频上的输出结果和我不一样呢?奇怪!

解决方案 »

  1.   

    我的也是4321是不是因为JDK版本差异?装个1.4.2试试吧
      

  2.   

    后建立的对象先回收?有顺序么??帮助文件里finalize方法没有说明回收顺序问题啊...当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
      

  3.   

    JDK或着的UltraEdit //很可能JDK
      

  4.   

    我有时是1432,有时是4321,就是说明回收方式不是固定的.你要看下垃圾回收器的基本原理是什么.
    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。