网上经常有这么说的:Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。请问:什么是和根进程不可达?为何例子中的三个对象互相引用了就不会造成内存泄露?

解决方案 »

  1.   

    有向图可以这么理解:
    ojbect是 节点, 引用是边。 方向表示引用/被引用的关系。m1 = new Obj();
    m2 = new Obj();root.ref = m1;
    m2.ref = m1;root -> m1 <-m2从root 开始, m2是不可抵达的,可以销毁。root 是指 
    1 thread stack 里的变量  
    2 静态域
      

  2.   

    学习了,看看think in java 或者 深入理解java虚拟机
      

  3.   

    无用对象判断方法补充:沿着对象的引用的被饱含关系追溯不到根对象或活动线程时,则这个对象被称为无用对象.
    ------------------------------
    如果JVM这么垃圾,还用置NULL才能回收,对List中装对象不能回收,对象相互引用不能回收,还能叫垃圾回收吗,JAVA绝对不会这么垃圾。在开发中碰到过内存泄露,主要通过置null解决掉了,我并不是觉得对象有引用指向他,而是线程太多,抢占非常厉害,线程如果在等待中,就会存在其中实例的对象不能及时释放,累计起来就回泄露。个人理解,在main方法中可以实例对象,也可以调用其他方法,
    只要main方法不结束,main追溯指向的对象,其对象不会释放,main调用的其他方法中实例对象在方法结束时就会释放。
    main结束,其方法中的对象也会释放,不释放主要针对在main方法中存在循环线程的情况。