gpt4 book ai didi

java - 有多少对象符合垃圾收集条件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:51:05 26 4
gpt4 key购买 nike

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. }

当到达第 7 行时,有多少对象符合垃圾回收条件?

按照这个问题给出的答案,第11行没有符合GC条件的对象;但根据我的说法,至少有一个对象 t2 在第 6 行设置为指向 null,应该有资格进行垃圾收集。

最佳答案

第 6 行的变量 t2 不是对该对象的唯一引用。从 t 到对象 t2 的引用是在函数 go 中创建的,而 t2 又持有对 t1 的引用,t1 是函数 go 返回的同一对象。所以第 6 行只是减少了引用的数量,但仍然有对该对象的实时引用。

编辑:让我们尝试更详细的解释,首先我稍微修改了代码以使解释更容易。每行一个语句和更少混淆的变量名称 + 我用字母 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 中通常没有名称,但为了便于解释,如果有名称会更容易)。

第 5 行:t 被传递给函数 go 所以我们转到第 9 行

第9行:参数s引用了第4行创建的对象A

第10行:初始化变量s1指向对象B

第 11 行:初始化变量 s2 以引用对象 C

第 12 行:s1.u 被设置为引用 s2,这意味着对象 B 获得了对 C 的引用

第 13 行:s2.u 被设置为引用 s1,因此对象 C 获得了对 B 的引用

第 14 行:s.u 被设置为引用 s2,这意味着对象 A 获得了对 C 的引用,请注意 C 也有对 B 的引用,因此此时存在从 A 到 B 的链

第15行返回对象B并返回到第5行

第 5 行:t2 设置为引用对象 B(B 现在被 t2 直接引用两次,一次是因为 t 引用对象 A,对象 A 引用 C,对象 A 引用 B)

第 6 行:引用 t2 被设置为空,所以 B 失去了一个引用,但 t 仍然存在,指向 A 的点指向 C 指向 B

关于java - 有多少对象符合垃圾收集条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com