日期:2014-05-20  浏览次数:20831 次

垃圾回收和finalize()
我显式的调用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();


}

}

运行后没有打印任何东西。

------解决方案--------------------
System.gc()虽然是显式通知JVM可以进行一次垃圾回收
但真正垃圾回收具体在什么时间仍然是不可预料的。
所以你调用了.gc(),不一定马上执行垃圾回收。
------解决方案--------------------
GC的线程优先级比较低,sleep一下就可以看到了
Java code

new Garbage();
Thread.sleep(100);
System.gc();

------解决方案--------------------
多建几个对象也可以看到一些效果.
------解决方案--------------------
执行了一下
调用System.out.println("The garbage is destroyed!"); 了
------解决方案--------------------
探讨
System.gc()虽然是显式通知JVM可以进行一次垃圾回收
但真正垃圾回收具体在什么时间仍然是不可预料的。
所以你调用了.gc(),不一定马上执行垃圾回收。

------解决方案--------------------
有个方法叫 System.runFinalization();

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