Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为Java程序入口点的对象是否被垃圾收集?_Java_Garbage Collection - Fatal编程技术网

作为Java程序入口点的对象是否被垃圾收集?

作为Java程序入口点的对象是否被垃圾收集?,java,garbage-collection,Java,Garbage Collection,如果我有一个类示例,并且我有一个实例方法,那么其中就有instanceMethod。 该类有一个main方法,我在其中创建Sample本身的对象并调用它的instanceMethod,而不使用引用变量 像这样: 新示例().instanceMethod() 在主楼里面 因为这个对象没有引用,垃圾收集器会收集它吗?在Java1中,我不相信在执行instanceMethod()时可以收集这个对象。在main方法的堆栈框架中有一个对对象的引用,至少在逻辑上是这样(JIT编译器可以省略它)。您没有将其分

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

像这样:

新示例().instanceMethod()

在主楼里面

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

在Java1中,我不相信在执行
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在这方面是一致的。