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指令,或者另一种可能的机制,通过这种机制可以释放循环变量中的引用,而不是在没有证据的情况下盲目断言它。