从回收机制的定义来讲 失去引用的对象被回收那两个对象互相有对方的引用  但这两个对象 一起不被任何其他地方所使用  会不会被回收我根据定义答是不能  接着被问那一个系统中有很多这种情况 不崩溃了么当时无言以对了请高手指点迷津

解决方案 »

  1.   

    那两个对象互相有对方的引用  但这两个对象 一起不被任何其他地方所使用  会不会被回收
    这句话我没听懂
     1,Hello hello = new Hello();
    如果这个hello长时间不使用的话,系统会把它给回收的(虽然hello还指向一个对象)
    2,Hello hello = new Hello();
    hello = null;
    这个hello已经回收了。
      

  2.   

    假设A持有B B持有A 但是A B的引用不被其他任何对象和变量持有
    java从堆栈和静态存储区出发,遍历所有的引用,每当它找到一个存活对象,就会给对象一个标记。全部标记完成时,没有标记的对象将被释放.这是A,B将不能到达 也不会产生标记 所以都会被释放
      

  3.   

    结合楼上的说明,google一下root set的概念和标记法。
      

  4.   

    从原理上来说,可能会这样。
    但是sun只是定义了java,jre的实现各个公司有自己的东西。
    我相信lz的问题,那些大公司不会没有考虑。
    比方说,不是一个对象一个对象进行gc,而是一簇一簇来,一簇的对象实体(最小单位是一个),如果不再被用到的话,就以簇的单位gc掉。这个算法也不算难。
      

  5.   

    如果a引用b,b引用a
    a = null;
    就会释放了,因为对象会出作用域。
      

  6.   

    这个问题叫环形引用问题,在早期的jdk版本中存在这个问题,不过sun公司早就解决这个问题,所以lz不必担心
      

  7.   

    SUN公司是怎么解决这个问题的啊·顶上
      

  8.   

    垃圾回收机制SUN官方是没有规定实现方式的,所以各位可以尽可能的用自己理解的方式来思考垃圾回收机制。
    现在有一些现成的算法实现,一种是跟踪收集垃圾的方式,java会指定一个根对象,例如拥有main方法的类的对象的程序入口会被定义为根对象,虚拟机会从这个根对象开始追踪引用链,被追踪到的对象为可访问对象,不会被回收,不能被追踪到的对象则定义为可回收对象,将被垃圾回收掉。
    当然垃圾回收机制可能更复杂,对于循环引用的若干对象,楼主其实不用担心它不会被回收掉。
      

  9.   

    目前版本java是可以回收的。
    数学基础是集合论,图论。楼主有兴趣有时间的话研究一下离散数学。
    没时间就记一下结论好了。
      

  10.   

    以前的GC机制有这个问题...会出现内存泄露
    现在的GC更只能点 好像可以回收这种情况....
      

  11.   

    如果a,b两对象是全局对象 或某一个对象是static对象,不会回收。
    如果a,b两对象是new对象,并且不是全局对象,会回收
      

  12.   

    补充下
    如果a,b两对象是全局对象 或某一个对象是static对象,不会回收。 
    如果a,b两对象是new对象,并且不是全局对象,并且不被使用,会回收