2012-01-02 33 views
1

如果我有一个类Sample,并且它有一个实例方法instanceMethod。 该类有一个主要的方法,我创建一个Sample对象,并在不使用引用变量的情况下调用它的instanceMethod。作为Java程序入口点的对象是否被垃圾回收?

是这样的:

new Sample()。instanceMethod();

里面的主。

由于该对象没有任何引用,垃圾回收器会收集它吗?

回答

6

在Java ,我不相信可以收集对象,而instanceMethod()正在执行。在main方法的堆栈帧对对象的引用,至少在逻辑上(JIT编译器可能会忽略它)。事实上,你没有把它分配给一个变量,并不会影响字节码。

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

基本上它不值得挂在错综复杂的角落案例 - 只依靠GC收集对象,不能以任何方式达成目标,但不收集可能仍在使用的对象。


在.NET对象可以仍然而一个实例方法是“在”的对象执行,如果JIT编译器可以证明无其变量的将被再次读取被垃圾收集。这非常混乱,并可能导致非常微妙的错误。

+0

但是,如果实例方法产生多个线程,并且它们在Sample对象中进行了处理。一旦instanceMethod结束。 不会引用thos线程将会丢失,如果这个obj是垃圾收集的? – 2012-01-02 10:38:07

+1

@AmoghTalpallikar:线程仍然在运行,并且如果那些线程实际上引用了该对象,那么该对象也会保持活动状态。但是,是的,如果它只是启动线程并记住对这些线程的引用,那么可以收集对象并且这些变量丢失了......但是无论如何您都无法访问这些变量,所以它没有任何区别。 – 2012-01-02 10:41:29

+0

更新的发现是,在Java中[实例方法运行时可能会收集对象](http://stackoverflow.com/a/26645534/2711488)。所以Java和.NET在这方面是一致的。 – Holger 2015-05-08 10:00:56