作为Java程序入口点的对象是否被垃圾收集?
如果我有一个类示例,并且我有一个实例方法,那么其中就有instanceMethod。 该类有一个main方法,我在其中创建Sample本身的对象并调用它的instanceMethod,而不使用引用变量 像这样: 新示例().instanceMethod() 在主楼里面 因为这个对象没有引用,垃圾收集器会收集它吗?在Java1中,我不相信在执行作为Java程序入口点的对象是否被垃圾收集?,java,garbage-collection,Java,Garbage Collection,如果我有一个类示例,并且我有一个实例方法,那么其中就有instanceMethod。 该类有一个main方法,我在其中创建Sample本身的对象并调用它的instanceMethod,而不使用引用变量 像这样: 新示例().instanceMethod() 在主楼里面 因为这个对象没有引用,垃圾收集器会收集它吗?在Java1中,我不相信在执行instanceMethod()时可以收集这个对象。在main方法的堆栈框架中有一个对对象的引用,至少在逻辑上是这样(JIT编译器可以省略它)。您没有将其分
instanceMethod()
时可以收集这个对象。在main
方法的堆栈框架中有一个对对象的引用,至少在逻辑上是这样(JIT编译器可以省略它)。您没有将其分配给变量这一事实对字节码影响不大
当然,当instanceMethod()
完成时,该对象可能有资格进行垃圾收集,但可能没有。例如,instanceMethod()
可以在静态变量中存储对该的引用
基本上,它不值得被复杂的角落案例挂断——只需要依靠GC收集对象,这些对象已经无法以任何方式访问,但不需要收集可能仍在使用的对象
1在.NET中,如果JIT编译器能够证明不会再次读取其变量,则当实例方法在对象中执行时,仍然可以对对象进行垃圾收集。它非常混乱,可能会导致非常微妙的错误。在Java1中,我不相信在执行
instanceMethod()
时可以收集对象。在main
方法的堆栈框架中有一个对对象的引用,至少在逻辑上是这样(JIT编译器可以省略它)。您没有将其分配给变量这一事实对字节码影响不大
当然,当instanceMethod()
完成时,该对象可能有资格进行垃圾收集,但可能没有。例如,instanceMethod()
可以在静态变量中存储对该的引用
基本上,它不值得被复杂的角落案例挂断——只需要依靠GC收集对象,这些对象已经无法以任何方式访问,但不需要收集可能仍在使用的对象
1在.NET中,如果JIT编译器能够证明不会再次读取其变量,则当实例方法在对象中执行时,仍然可以对对象进行垃圾收集。这非常混乱,可能会导致非常微妙的错误。但如果实例方法生成多个线程,并且它们在示例对象中被引用,则可以这样说。一旦instanceMethod结束。如果这个对象被垃圾收集,对这些线程的引用不会丢失吗?@AmoghTalpallikar:这些线程仍然在运行,如果这些线程确实引用了该对象,那么也会使该对象保持活动状态。但是,是的,如果它只是启动线程并记住对这些线程的引用,那么对象可能会被收集,而这些变量可能会丢失。。。但是你无论如何都不能访问这些变量,所以这没有什么区别。新的发现在Java中也是如此。因此,java和.NET在这方面是一致的。但是,如果实例方法产生多个线程,它们会在示例对象中被重排。一旦instanceMethod结束。如果这个对象被垃圾收集,对这些线程的引用不会丢失吗?@AmoghTalpallikar:这些线程仍然在运行,如果这些线程确实引用了该对象,那么也会使该对象保持活动状态。但是,是的,如果它只是启动线程并记住对这些线程的引用,那么对象可能会被收集,而这些变量可能会丢失。。。但是你无论如何都不能访问这些变量,所以这没有什么区别。新的发现在Java中也是如此。因此,java和.NET在这方面是一致的。