【发布时间】:2012-01-31 18:05:58
【问题描述】:
如果我有一个类 Sample 并且我有一个实例方法,那么 instanceMethod 就在其中。 该类有一个 main 方法,我在其中创建 Sample 本身的对象,并在不使用引用变量的情况下调用它的 instanceMethod。
像这样:
new Sample().instanceMethod();
在主里面。
由于这个对象没有引用,垃圾收集器会收集它吗?
【问题讨论】:
如果我有一个类 Sample 并且我有一个实例方法,那么 instanceMethod 就在其中。 该类有一个 main 方法,我在其中创建 Sample 本身的对象,并在不使用引用变量的情况下调用它的 instanceMethod。
像这样:
new Sample().instanceMethod();
在主里面。
由于这个对象没有引用,垃圾收集器会收集它吗?
【问题讨论】:
在 Java1 中,我不相信在执行 instanceMethod() 时可以收集对象。在main 方法的堆栈框架中是 对对象的引用,至少在逻辑上是这样(JIT 编译器可能会忽略它)。您没有将其分配给变量这一事实不会对字节码产生太大影响。
当然,当instanceMethod() 完成时,对象可能有资格进行垃圾回收 - 但可能没有。例如,instanceMethod() 可以在静态变量中存储对this 的引用。
基本上不值得被复杂的极端情况挂断 - 只依靠 GC 收集无法以任何方式再到达的对象,而不是收集可能仍在使用的对象。
1 在 .NET 中,如果 JIT 编译器能够证明其没有变量将被再次读取。这非常令人困惑,并且可能导致非常微妙的错误。
【讨论】: