【问题标题】:A question about GC关于GC的问题
【发布时间】:2010-04-26 14:05:08
【问题描述】:

这是一个java考试中的问题,

#1 有多少对象符合 gabage 收集条件?

public class Main   {

Integer x = 32768;
public static void main(String[] args)
{ 
    Main m = new Main();
    m = null;
    // #1
  } 
}

我以为它只是收集 Integer x,GC 甚至收集 Main 对象 m 吗?

【问题讨论】:

  • 真正的问题是如何根据经验进行测试。不过,您的问题的答案是 2:xm。但我怀疑 GC 会在程序结束之前触发。
  • 基于此 OP 的附加问题:即使 args 持有对字符串的引用,JIT GC 是否可以因为没有引用而获得 args?我想知道发生在订购之前是否合法。实际上,GC 永远不会在这么小的程序中发生。这只是一个书呆子问题。

标签: java


【解决方案1】:

是的,它确实收集了 Main 对象。由于整数本身既不是一个单独的对象(它是 Main 的成员)也不是一个指针,它不会被单独收集,而只是作为 Main 的一部分。

【讨论】:

  • 整数是值对象就不会被收集吗?
  • 整数(大写)是一个对象
  • 错误...这是Java。我一直在这里用 C# 思考。你是对的。它是 int 的装饰器。
【解决方案2】:

垃圾收集器可能会删除两个对象。

分配给 m 的对象不再可达,Main 中的 Integer 也不再可达。

编辑:您可以问自己:“我现在是否可以通过某种方式访问​​该对象?”如果回答为“否”,垃圾收集器可能会删除它。

【讨论】:

    【解决方案3】:

    您可能有一点困惑,即可以在没有主对象存在的情况下调用主方法。那是因为它是一个静态方法。同样,“整数 x”仅作为主对象中的字段存在。因此,当您创建一个新的 Main 对象 m 时,您还将创建整数 m.x 作为 m 的一部分。那么当你将 m 设置为 null 时,之前 m 引用的对象就是垃圾,可以被回收。

    现在,何时收集它是一个完全不同的问题。真的没有保证;然而,由于它的使用是如此本地化,几乎可以肯定它会在下一个次要的收集/清除/挑选你最喜欢的术语时得到处理。

    【讨论】:

      【解决方案4】:

      它可以。不再引用它,因此它有资格进行垃圾回收。

      【讨论】:

        【解决方案5】:

        Main 的实例符合垃圾回收条件,通常整数也符合条件。但是 Integer 实例也可以由 Integer 类缓存,如果配置为这样做(请参阅this answer)。

        使用Integer#valueOf(int)(用于自动装箱)时,通常只缓存-128到127之间的整数,但可以通过设置系统属性java.lang.Integer.IntegerCache.high来增加上限

        【讨论】:

          【解决方案6】:

          我使用最近的 OpenJDK 进行的观察表明,只有在方法退出后,它才会真正收集它孤立的任何引用。我完全没想到会这样,但事情就是这样发生的。将这些代码行提取到另一个方法中,然后返回到 main(),确实允许收集实例。

          我认为这是一个愚蠢的问题。 (编辑:我的意思是考试题!不要侮辱提交者!)这完全取决于您如何定义“合格”。就我而言,我会说,一旦没有剩下的引用,实例就有资格被收集,只是它永远不会真正收集到之后的某个时间方法返回。

          【讨论】:

            猜你喜欢
            • 2017-12-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多