1. public class Tahiti {
2. Tahiti t;
3. public static void main(String[] args) {
4. Tahiti t = new Tahiti();
5. Tahiti t2 = t.go(t);
6. t2 = null;
7. // more code here
8. }
9. Tahiti go(Tahiti t) {
10. Tahiti t1 = new Tahiti(); Tahiti t2 = new Tahiti();
11. t1.t = t2; t2.t = t1; t.t = t2;
12. return t1;
13. }
14. }
根据这个问题的答案,在第11行没有符合GC条件的对象;但是根据我的说法,至少有一个对象t2,它在第6行被设置为指向null,应该有资格进行垃圾回收。
第6行中的变量t2不是对该对象的唯一引用。有一个从t到对象t2的引用,该对象是在函数go中创建的,该对象又持有对t1的引用,该对象是由函数go返回的同一个对象。所以第6行仅仅减少了引用的数量,但是仍然有对对象的活动引用。
编辑:让我们尝试一个更详细的解释,首先我对html" target="_blank">代码进行了一些修改,以使解释更容易。每行一个语句和不太容易混淆的变量名+I用字母A、B和C标识了三个相关的对象。
1. public class Tahiti {
2. Tahiti u;
3. public static void main(String[] args) {
4. Tahiti t = new Tahiti(); // object A
5. Tahiti t2 = t.go(t);
6. t2 = null;
7. // more code here
8. }
9. Tahiti go(Tahiti s) {
10. Tahiti s1 = new Tahiti(); // object B
11. Tahiti s2 = new Tahiti(); // object C
12. s1.u = s2;
13. s2.u = s1;
14. s.u = s2;
15. return s1;
16. }
17. }
第4行:变量t被初始化以引用一个新对象。让我们将该对象本身称为A(它在java中通常没有名称,但出于这种解释的考虑,如果它有名称会更容易)。
第11行:初始化变量s2以引用对象C
第12行:S1.U被设置为引用s2,这意味着对象B获得对C的引用
第13行:S2.U被设置为引用s1,因此对象C get是对B的引用
在下面的代码中,假设调用了。最初引用的对象在哪一点/哪一行符合垃圾收集的条件? 如果或有一个公共、受保护、默认或静态的访问修饰符,它会影响对象在什么点上有资格进行垃圾收集吗?如果是,它会受到什么影响? 我的第一个想法是,当测试对象有资格进行垃圾收集时,该对象有资格进行垃圾收集
在执行之后,我很难理解。有多少对象有资格进行垃圾收集?
当Tester类的主方法结束时,有多少对象符合垃圾收集的条件?我的印象是答案是两个,尤其是a1,b1。然而,我找到了一个正确的答案,那就是只有一个对象是合格的。我认为,由于我们没有将b1指定为a2中的成员变量,b1在主要结束之前被分配为null,所以应该由垃圾收集器收集。什么是真的?
给定以下代码,在main()中创建了多少对象,在执行第15行之后,有多少对象符合垃圾回收机制? 3个已创建,0个符合条件 4个已创建,1个符合条件 5个创建,2个符合条件 3个已创建,2个符合条件 以上都不是 好的,首先,请不要把它标记为家庭作业。这是我大学的一个测试题。根据我的说法,应该有两个创建的对象,第15行之后有一个符合垃圾收集的条件。这是因为只有两个新的操作符用于创建对象,而“d”在开始
有人能给我解释一下原因吗?
[GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580