两个相互引用对象的垃圾回收

时间:2022-11-09 00:04:20
从回收机制的定义来讲 失去引用的对象被回收

那两个对象互相有对方的引用  但这两个对象 一起不被任何其他地方所使用  会不会被回收

我根据定义答是不能  

接着被问那一个系统中有很多这种情况 不崩溃了么

当时无言以对了

请高手指点迷津

12 个解决方案

#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对象,并且不是全局对象,并且不被使用,会回收

#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对象,并且不是全局对象,并且不被使用,会回收