temp和outer在虚拟机里是两个对象,只是temp中有一个field指向outer,因此temp被置为null后,temp可以被回收,但outer仍然存在,因为有forlong指向outer

解决方案 »

  1.   

    多谢!再给点见解吧,回收时的碎片问题是怎样解决的呢?
    还有分配内存的时候,是不是尽量让temp对象和outer对象处于连续的空间中呢?
    还希望大家都来讨论一下虚拟机在内存处理上的一些问题.
      

  2.   

    class Collect{
    public String outer=new String("testouter");
    private String inner=new String("testinner");

    public void finalize(){
    System.out.println("finalize");
    }
    }class TestCollect{
    public static void main(String[] args){
         Collect temp=new Collect();    
    String forlong=temp.outer;

    temp=null;
    System.gc();
        }
    }
    上面的片断可以说明temp引用被置空后就可以被回收,
    不管有没有对其内部对象有没有引用都是这样的,
      

  3.   

    对于虚拟机在内存处理上的一些问题,我也不是太清楚,楼主如想弄清楚,去看<<深入Java虚拟机>>网上应该有
      

  4.   

    对于虚拟机在内存处理上的一些问题,我也不是太清楚,楼主如想弄清楚,去看<<深入Java虚拟机>>网上应该有
      

  5.   

    java的垃圾回收机制本身就是一个耗时的过程。所以java vm提供有几种的回收算法可供选择。
    http://dev.csdn.net/develop/article/60/60811.shtm
    可以看看这篇文章,说的很清楚。
    实际上一个原则就是尽量早的在对象无用的时候置为null,以便gc可以在最近的一次处理把垃圾回收。
      

  6.   

    java在运行过程中会有一个stack记录正在使用的reference,还有一个static storage用于存储静态类的数据和方法。每次gc,都会以此没依据查找内存中的每个对象,如果没有上述两个地方的reference指向的object便会被清除。楼主的例子中应该只有当forlong设置为null时,TestCollect的实例才会被回收。java中主要的机制是:stop and copy 和  and sweep 两种方式。另:gc只有当内存吃紧的时候(这个由jvm定),才会执行(为保证程序运行的速度)。除非你写上代码System.gc()