Object obj = new Object();
obj被存放在栈中,new Object();被存放在堆中,obj是new Object();的引用变量,对不对?
网上说在没有引用变量指向对象或数组之后,堆才会释放内存,什么情况才是没有引用变量指向对象或数组?
谢谢解答……

解决方案 »

  1.   

    obj被存放在栈中,new Object();被存放在堆中,obj是new Object();的引用变量,对不对?对。网上说在没有引用变量指向对象或数组之后,堆才会释放内存,什么情况才是没有引用变量指向对象或数组?这个引用变量引用的是堆中的对象地址,当栈中所有的变量都没有堆中对象地址的引用了时,堆中的对象就成了垃圾,垃圾收集器可以清除对象释放内存了。
      

  2.   

    如:
    Object obj1 = new Object();
    Object obj2 = obj1;
    Object obj3 = obj2;其他引用等;当obj1、obj2、obj3生命周期结束了;
    obj1 = null;
    obj2 = null;
    obj3 = null;等等栈中所有的变量这里是obj1、obj2、obj3,都没有堆中对象地址的引用,即new Object()的地址引用。
      

  3.   


    什么时候obj1、obj2、obj3生命周期才会结束
      

  4.   

    首先要知道堆中的每个对象都可能处于:
    1、可触及状态;2、可复活状态;3、不可触及状态;
    当一个对象处于不可触及的状态时,垃圾回收器(GC)才会真正回收它占用的内存
    // 可触及状态
    Object obj = new Object();
    // 对象不再被引用,可复活状态
    // 在这个状态下,GC会准备释放它占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的
    // finalize()方法,这些finalize()方法有可能使对象重新转到可触及状态
    obj = null;
    // 当Java VM 执行完所有可复活对象的finalize()方法后,假如这些方法都没有使对象转到可触及状态,那么对象就进入不可触及状态。这是GC才会真正回收它占用的空间
      

  5.   


    可以认为,当obj被赋予另外的值的时候,原指向new Object()的引用变量消失。
    垃圾回收器在检查的时候就会清缓存!???不知道这么理解对不对