public class Finalizer {
public static void main(String[] args) {
   new Person();
   new Person();
   try {
      Thread.sleep(30000);
   } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}
}class Person{
   public void finalize(){
      System.out.println("gon");
   }
}你们可能说加 System.gc(); 但是JVM规范是程序彻底退出,会执行对象的垃圾清理工作的。要不然内存岂不是越来越小。

解决方案 »

  1.   

    好像加了System.gc()也不一定执行吧
      

  2.   

    测试结束,退出main前,加了System.gc(); 肯定执行 : gon
    所以楼上错了。
      

  3.   

    我猜是否是这样:finalize方法,是虚拟机在回收内存时调用的,此时可以理解为虚拟机是“活的”,只有虚拟机活着,且进行垃圾回收,finalize方法才被执行。而main()方法都结束了,虚拟机都“死了”,虚拟机实例获得的内存自然就释放了,这个释放并不是虚拟机做的工作,是操作系统的工作吧。
      

  4.   


    public class Finalizer {
    public static void main(String[] args) {
    for(int i = 0; i<1000;i++){
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    new Person();
    }
    try {
    Thread.sleep(3000);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }class Person {
    public void finalize() {
    System.out.println("gon");
    }
    }这样试试看
      

  5.   

    3楼:main()方法都结束了,虚拟机都“死了”,虚拟机实例获得的内存自然就释放了,这个释放并不是虚拟机做的工作,是操作系统的工作吧。怎么可能是这样。
    我是说加不加System.gc(),为什么有区别,大家执行下看吧。