为啥指定的对象有资格进行垃圾回收?

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 中,c2c3 仍然引用了第三个实例(由 main 创建)。因此,第二个对象是唯一准备好进行 GC 的对象。至少(该代码中唯一提到的一个)。抱歉,如果您阅读了我之前的细分,我把我的 c2c3 搞混了。 :-)

以上是关于为啥指定的对象有资格进行垃圾回收?的主要内容,如果未能解决你的问题,请参考以下文章

对象何时有资格进行垃圾收集?

单例对象是否符合垃圾回收条件?类中的静态字段如何收集垃圾?

为啥 io类的资源,在使用完后,需要进行释放

Java中垃圾回收有啥目的?啥时候进行垃圾回收?

Java面试题50 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回