我显式的调用System.gc(); 它一定会执行我重写的 protected void finalize() 吗? 我感觉书上说的是,但是我写的程序它没有执行。
package pack1;class Garbage {

static int count=0;
Garbage()
{
count++;
}

protected void finalize()
{
    System.out.println("The garbage is destroyed!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub

new Garbage();
new Garbage();
System.gc();
}}运行后没有打印任何东西。

解决方案 »

  1.   

    System.gc()虽然是显式通知JVM可以进行一次垃圾回收
    但真正垃圾回收具体在什么时间仍然是不可预料的。
    所以你调用了.gc(),不一定马上执行垃圾回收。
      

  2.   

    恩,我只想了解一下机制,那就是说:1. 显式调用了System.gc(),它也不一定会去立刻回收内存?
    2.显式调用了System.gc(),它也不一定会立刻调用重写的finalize()?
      

  3.   

    GC的线程优先级比较低,sleep一下就可以看到了new Garbage();
    Thread.sleep(100);
    System.gc();
      

  4.   

    执行了一下
    调用System.out.println("The garbage is destroyed!"); 了
      

  5.   

    1楼正解。
    1. 显式调用了System.gc(),它也不一定会去立刻回收内存?
    2.显式调用了System.gc(),它也不一定会立刻调用重写的finalize()?
    楼主这两个问题,相当于一个概念,如果在被回收会调用finalize();
    所以判断有没有被回收,看他的finalize()有没有被调用就可以了。
      

  6.   

    有个方法叫  System.runFinalization();你调用下,就可以看到你的finalize方法被执行到了
      

  7.   

    System.gc()虽然是显式通知JVM可以进行一次垃圾回收
    但真正垃圾回收具体在什么时间仍然是不可预料的。
    所以你调用了.gc(),不一定马上执行垃圾回收。