Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Jvm - Fatal编程技术网

JAVA:在循环中定义的引用

JAVA:在循环中定义的引用,java,performance,jvm,Java,Performance,Jvm,我只是好奇。 假设我在while/for循环中定义了一个引用 JVM是每次迭代都定义这个引用,还是经过优化只定义一次 它定义了每一次,并且仅限于该循环迭代 一旦循环迭代完成,它就有资格进行GC 正如Louis Wasserman所评论的,每次都会重新初始化变量,但内存空间可能会被重用。每次都会定义它。据我所知,这方面没有优化 -循环每次迭代时,定义引用,但引用范围仅附加到该迭代 强> > ->强>考虑在循环外强> > >赋值对象< /强>对它内< /强>循环,则引用保持不变,但在每次迭代中引用

我只是好奇。
假设我在while/for循环中定义了一个引用


JVM是每次迭代都定义这个引用,还是经过优化只定义一次

它定义了每一次,并且仅限于该循环迭代

一旦循环迭代完成,它就有资格进行GC


正如Louis Wasserman所评论的,每次都会重新初始化变量,但内存空间可能会被重用。

每次都会定义它。据我所知,这方面没有优化

-循环每次迭代时,定义引用,但引用范围仅附加到该迭代


<>强> > ->强>考虑在循环外<>强> > <强> >赋值对象< /强>对它<强>内< /强>循环,则引用保持不变,但在每次迭代中引用该类型的新对象。

在每次迭代中定义引用。一旦代码被优化为本机代码,就可以将其移出循环,这样就不必对性能产生影响。如果您每次都将此引用设置为一个新的对象,则它可能会在每次迭代中创建一个新对象,除非该对象的创建也已优化。

您所说的“定义”是什么意思?这取决于你的意思。每次都会重新初始化变量,但内存空间可能会被重用。您所说的“定义引用”是什么意思?严格来说,引用是变量的值,这与分配对象相差甚远。这两种解释有非常不同的答案。它将不符合GC的资格。堆栈槽将继续存在,直到被循环后声明的后续变量重用(如果有),否则直到方法退出。没有与循环的右括号对应的JVM指令,因此JVM无法知道插槽已不再使用。@Ejp:我很高兴更新我的答案,但您能提供任何参考吗?我认为heap是将被gced的位置,而不是stack frame。@EJP-如果插槽被一个新值覆盖,旧对象就可以被收集。@HotLicks当然,这就是我提到它的原因。我应该澄清的是,只有循环的最后一次迭代才会留下悬空的插槽,直到插槽被重用或释放为止。堆栈包含对堆的引用。OP的循环变量占用的堆栈槽在方法开始时分配,并在方法结束时释放。在此之前,它能够保存引用,从而防止被引用对象的GC。如果您想对此进行讨论,您需要显示一条与循环的右括号相对应的JVM指令,或者另一种可能的机制,通过这种机制可以释放循环变量中的引用,而不是在没有证据的情况下盲目断言它。