【问题标题】:Does the object which is the entry point of a Java program get garbage collected?作为 Java 程序入口点的对象是否会被垃圾回收?
【发布时间】:2012-01-31 18:05:58
【问题描述】:

如果我有一个类 Sample 并且我有一个实例方法,那么 instanceMethod 就在其中。 该类有一个 main 方法,我在其中创建 Sample 本身的对象,并在不使用引用变量的情况下调用它的 instanceMethod。

像这样:

new Sample().instanceMethod();

在主里面。

由于这个对象没有引用,垃圾收集器会收集它吗?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    在 Java1 中,我不相信在执行 instanceMethod() 时可以收集对象。在main 方法的堆栈框架中 对对象的引用,至少在逻辑上是这样(JIT 编译器可能会忽略它)。您没有将其分配给变量这一事实不会对字节码产生太大影响。

    当然,当instanceMethod() 完成时,对象可能有资格进行垃圾回收 - 但可能没有。例如,instanceMethod() 可以在静态变量中存储对this 的引用。

    基本上不值得被复杂的极端情况挂断 - 只依靠 GC 收集无法以任何方式再到达的对象,而不是收集可能仍在使用的对象。


    1 在 .NET 中,如果 JIT 编译器能够证明其没有变量将被再次读取。这非常令人困惑,并且可能导致非常微妙的错误。

    【讨论】:

    • 但是说如果实例方法产生多个线程并且它们在 Sample 对象中被引用。一旦 instanceMethod 结束。如果这个 obj 被垃圾收集,对这些线程的引用不会丢失吗?
    • @AmoghTalpallikar:线程仍然在运行,如果这些线程实际上引用了对象,那么这也会使对象保持活动状态。但是是的,如果它只是启动线程并记住对这些线程的引用,那么可以收集对象并且这些变量会丢失......但是你无论如何都无法访问这些变量,所以它不会区别。
    • Java 中的objects may get collected while instance methods are running 也有较新的发现。所以 Java 和 .NET 在这方面是不相上下的。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多