class Gctext {
   private String name;
   public Gctext(){}
   public Gctext(String name) {
      this.name = name;
      System.out.println(name + "建立");   }
   // 对象回收前执行
   protected void finalize() {
      System.out.println(name + "被回收");
   }
}class UseGc {
   public static void main(String[] args){ 
      System.out.println("请按Ctrl + c终止程序");      Gctext obj1 = new Gctext("Object1"); 
      Gctext obj2 = new Gctext("Object2"); 
      Gctext obj3 = new Gctext("Object3"); 
      Gctext[] obj4 = new Gctext[10];
      obj4[0] = new Gctext();
      obj4[1] = new Gctext("数组内边");      obj1 = null; 
      obj2 = null; 
      obj3 = null; 
      obj4 = null;//建议回收对象 
      System.gc();       while(true);//不断执行程序 
  }}执行结果:
-----------------------------------
请按Ctrl + c终止程序
Object1建立
Object2建立
Object3建立
数组里边建立
数组里边被回收
null被回收
Object3被回收
Object2被回收
Object1被回收后建立的居然先回收!!这是规律吗??

解决方案 »

  1.   

    多运行几次,数组再大一点,数组元素再多一点,比如100个,1000个,你就会发现不一样了System.gc() 只是建议JVM执行回收操作,但是JVM不一定马上执行,也不一定按你说的执行
      

  2.   

    finalize()是JVM在空闲的时候,指不定什么时候运行的方法,数据少了看不出来的,建议LZ,弄个上千次试试
      

  3.   


    终于找到证据,说明 Object[] a = new Object[10]; 只是一个声明大小,没有在堆里分配内存。大家看看对不对?内容与标题好像不符哦
      

  4.   

    而int[] a = new int[5];
    就是已经在堆里分配了,是吧?
    因为通过调试可知,初值为0;