Code Bye

关于垃圾回收的问题。

public class Tahiti {

	Tahiti t;

	public static void main(String[] args) {
		Tahiti t = new Tahiti();
		Tahiti t2 = t.go(t);
		t2 = null;
		System.out.println(t2);
	}

	Tahiti go(Tahiti t) {
		Tahiti t1 = new Tahiti();
		Tahiti t2 = new Tahiti();
		t1.t = t2;
		t2.t = t1;
		t.t = t2;
		return t1;
	}
}

问题是此过程一共有多少个对象满足垃圾回收的条件? 
答案是 0 个
想问下原因,t2 = null; 之后 t2不满足回收条件吗? 大大路过麻烦指点迷津 希望推荐一下垃圾回收的文章。

关键在于go方法,return的那个对象又和入参的t关联,因此即使主方法的t2=null了,但是在t对象里还有这个对象的引用。
画个图来理解吧。
引用 1 楼 oh_Maxy 的回复:

关键在于go方法,return的那个对象又和入参的t关联,因此即使主方法的t2=null了,但是在t对象里还有这个对象的引用。
画个图来理解吧。

是因为go方法里t2.t还有这个对象的引用?


10分
引用 2 楼 mimi_mhmh 的回复:
Quote: 引用 1 楼 oh_Maxy 的回复:

关键在于go方法,return的那个对象又和入参的t关联,因此即使主方法的t2=null了,但是在t对象里还有这个对象的引用。
画个图来理解吧。

是因为go方法里t2.t还有这个对象的引用?

是因为 t.t=t2;   t2.t=t1; 而这个t,在main方法里还是有引用的。


10分
总共new了三个对象 t持有了t2  t2持有了t1
所以三个对象都不会被回收
我觉得这是很奇葩的问题,八成是面试官装B用的。 虚拟机进程都结束了还不回收?

<<深入理解Java虚拟机>> 对与垃圾回收机制将的很详细。 

楼上说得对,产生几个对象就回收几个。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于垃圾回收的问题。