【问题标题】:How many objects will be eligible for garbage collection?有多少对象有资格进行垃圾回收?
【发布时间】:2016-05-16 09:07:24
【问题描述】:

所以我最近参加了工作面试,并被问到以下问题。 (其实只是个试写,所以问不出问题)

在 main 方法结束时,有多少对象可以进行垃圾回收?

public class Main {
    public static void main(String[] args) {
        Object obj;
        for (int i = 0; i < 5; i++) {
            obj = new Object();
        }
        obj = null;
    }
}

(A) 0

(B) 1

(C) 5

我知道它是 0,因为至少有一个对象 (obj) 将被垃圾回收,但我也知道 obj 并不是真正的对象,它只是对它的引用。所以我的答案是 5。

正确吗?如果不是,那为什么?

【问题讨论】:

  • 哇.. 单行子弹太多.. 顺便说一句 5 是正确答案
  • 这太容易了。应该是Five。但我也必须在哪一行提到??

标签: java garbage-collection


【解决方案1】:

您的回答5 is correct

这里总共通过 for 循环创建了 5 个对象,所有这些对象都将在方法结束时进行垃圾回收。

【讨论】:

    【解决方案2】:

    可能0

    编译器可能会进行一些优化并消除整个循环,并首先避免创建在循环中创建的五个对象。

    因此,如果没有进行编译器优化,则会在循环内创建 5 个对象,并且它们的引用将在变量 obj 中被覆盖,最后变量将引用分配给 null 的最后一个对象。

    【讨论】:

    • 这也是一种选择吗?在什么情况下编译器可以决定这样做?
    • 如果循环什么都不做,编译器可能会消除它。
    • 也许你是对的,但这仍然取决于编译器及其运行时优化。 +1
    • 构造函数可能还有一些编译器不能忽略的业务逻辑。
    • 我不确定这是否会被优化。如果构造函数中发生了什么事怎么办?也许因为这只是一个普通的Object 实例,但我仍然怀疑不会发生任何事情。无论如何,我想这个问题是为了展示对垃圾收集背后的想法的理解,并不意味着考虑编译器优化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多