如果我有一个类Sample,并且它有一个实例方法instanceMethod。 该类有一个主要的方法,我创建一个Sample对象,并在不使用引用变量的情况下调用它的instanceMethod。作为Java程序入口点的对象是否被垃圾回收?
是这样的:
new Sample()。instanceMethod();
里面的主。
由于该对象没有任何引用,垃圾回收器会收集它吗?
如果我有一个类Sample,并且它有一个实例方法instanceMethod。 该类有一个主要的方法,我创建一个Sample对象,并在不使用引用变量的情况下调用它的instanceMethod。作为Java程序入口点的对象是否被垃圾回收?
是这样的:
new Sample()。instanceMethod();
里面的主。
由于该对象没有任何引用,垃圾回收器会收集它吗?
在Java ,我不相信可以收集对象,而instanceMethod()
正在执行。在main
方法的堆栈帧是对对象的引用,至少在逻辑上(JIT编译器可能会忽略它)。事实上,你没有把它分配给一个变量,并不会影响字节码。
当然,当instanceMethod()
完成时,对象可能有资格进行垃圾回收 - 但它可能不会。例如,instanceMethod()
可能会将对this
的引用存储在静态变量中。
基本上它不值得挂在错综复杂的角落案例 - 只依靠GC收集对象,不能以任何方式达成目标,但不收集可能仍在使用的对象。
在.NET对象可以仍然而一个实例方法是“在”的对象执行,如果JIT编译器可以证明无其变量的将被再次读取被垃圾收集。这非常混乱,并可能导致非常微妙的错误。
但是,如果实例方法产生多个线程,并且它们在Sample对象中进行了处理。一旦instanceMethod结束。 不会引用thos线程将会丢失,如果这个obj是垃圾收集的? – 2012-01-02 10:38:07
@AmoghTalpallikar:线程仍然在运行,并且如果那些线程实际上引用了该对象,那么该对象也会保持活动状态。但是,是的,如果它只是启动线程并记住对这些线程的引用,那么可以收集对象并且这些变量丢失了......但是无论如何您都无法访问这些变量,所以它没有任何区别。 – 2012-01-02 10:41:29
更新的发现是,在Java中[实例方法运行时可能会收集对象](http://stackoverflow.com/a/26645534/2711488)。所以Java和.NET在这方面是一致的。 – Holger 2015-05-08 10:00:56