为啥指定的对象有资格进行垃圾回收?
Posted
技术标签:
【中文标题】为啥指定的对象有资格进行垃圾回收?【英文标题】:Why does the specified object be eligible for garbage collection?为什么指定的对象有资格进行垃圾回收? 【发布时间】:2011-01-18 20:32:04 【问题描述】:郑重声明,我不是一个 Java 初学者,而是 - 相反 - 一个有点忘记 Java 基础知识的中级人员。
C类 公共静态无效主要(字符串一个[]) C c1=新 C(); C c2=m1(c1); //第 4 行 C c3=新 C(); c2=c3; // 第 6 行 另一种方法(); 静态 C m1(C ob1) ob1 =新C(); // 第 10 行 返回ob1; 无效另一个方法()
从上面的代码:
为什么在第 6 行之后,C
类型的 2 个对象符合垃圾回收(GC)的条件?
为什么不在第 4 行和第 10 行,将c1
的副本 传递给m1()
方法。因此,最终在第 6 行中,将有 1 个对象(而不是 2 个)符合 GC 条件。毕竟,java不是按值传递而不是按引用传递吗?
【问题讨论】:
这段代码不应该编译:anothermethod
不是静态的,而是在静态上下文中调用的
【参考方案1】:
按值传递引用和按引用传递值之间存在区别:)
Is Java Pass By Reference Java is never pass by reference right right Pass By Reference Or Pass By Value
您可能还想查看 Jon Skeet 关于 C# 参数传递语义的文章,因为这是他最喜欢的“程序员无知”的宠儿:What's your favorite 'programmer ignorance' pet peeve。
所以基本上,我看到您的代码执行以下操作:
c1 = new C("Alice");
// m1(C obj1) -- c1 gets passed to m1, a copy of the reference is made.
// -- there are now two references to Alice (c1, obj1)
// obj1 = new C("Bob"); -- there is now one reference to Alice
// and one reference to Bob
// return obj1; -- returns a reference to Bob(c1 still reference Alice)
// -- when m1 returns, one of the references to Alice disappears.
c2 = m1(c1); // c2 points to Bob
c3 = new C("Charlie");
c2 = c3; // <-- Bob is eligible for collection.
// There are now two references to Charlie
【讨论】:
【参考方案2】:是什么让您认为C
类型的两个对象在第 6 行之后可用于 GC?我只看到一个(c2
)。您使用什么工具会告诉您其他情况?
关于您关于将c1
传递给m1
方法的问题:您传递的(按值)是对对象的引用——如果您愿意,您可以通过该句柄抓取对象——而不是它的副本。实际上,您将引用传递给m1
的事实完全无关紧要-您从不使用该引用,而是立即用对新对象的引用覆盖它,然后将其返回(这不会影响c1
main
中仍然引用)。
【讨论】:
参考以下链接中的问题13:examsguide.com/scjp/freequestions2.html @Catfish:我们并不是唯一认为他们错了的人:coderanch.com/t/452512/Programmer-Certification-SCJP/… @Catfish:关于他们,他们错了。从代码的第 6 行开始(看起来和他们的差不多),(由 main 创建的)第一个 C 仍然在 main 中引用为 c1;第二个 C 创建(由 m1)不再被引用(因为引用它的变量没有引用第三个)并且可能被 GC'd;在main
中,c2
和c3
仍然引用了第三个实例(由 main 创建)。因此,第二个对象是唯一准备好进行 GC 的对象。至少(该代码中唯一提到的一个)。抱歉,如果您阅读了我之前的细分,我把我的 c2
和 c3
搞混了。 :-)以上是关于为啥指定的对象有资格进行垃圾回收?的主要内容,如果未能解决你的问题,请参考以下文章