Java方法中的最大局部变量数

Baj*_*jji 6 java

我理解单一责任原则的重要性,但从技术上讲,我们对每个java方法中的局部变量(存储在堆栈帧中)的数量有任何上限.并且上限是否等于最大堆栈大小,即,我可以使用大小等于配置的最大堆栈大小的堆栈帧吗?

kos*_*osa 5

定义局部变量的数量没有上限.如果定义了太多无法放入堆栈框架的变量(或)JVM无法为该大小分配堆栈框架,它将抛出StackOverflowError并退出.

斯坦福教授有很好的讲座,可以帮助你.

  • @Nambari肯定."i/aload"将一个字节参数作为输入,该服务器作为LVA(局部变量数组)中的索引,这使得它可以达到256个可能的值,因此最多可以包含255个局部变量.除非使用**wide**(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings),否则请查看底部; 那么它可以在LVA中使用16位索引,因此可以使用65536个局部变量. (6认同)

Ale*_*lec 5

我对这个明确的问题缺乏直接答案感到惊讶,所以这里是:JVM 的最大帧大小为 65535 个本地变量,最大堆栈大小为 65535,每个条目long消耗double2 个插槽。来自 JVM 规范4.11。Java虚拟机的局限性

\n
\n
    \n
  • 调用方法时创建的框架的局部变量数组 (\xc2\xa72.6) 中局部变量的最大数量受 Code 属性 (\xc2\xa74.7.3) 的 max_locals 项的大小限制为 65535 )给出方法的代码,并通过 Java 虚拟机指令集的 16 位局部变量索引。

    \n

    请注意,long 和 double 类型的值均被视为保留两个局部变量,并为 max_locals 值贡献两个单位,因此使用这些类型的局部变量进一步减少了此限制。

    \n
  • \n
  • 帧中操作数堆栈的大小 (\xc2\xa72.6) 由 Code 属性 (\xc2\xa74.7.3) 的 max_stack 字段限制为 65535 个值。

    \n

    请注意,long 和 double 类型的值均被视为对 max_stack 值贡献两个单位,因此在操作数堆栈上使用这些类型的值会进一步减少此限制。

    \n
  • \n
\n
\n

理论上,Java 语言可以通过将本地变量和堆栈卸载到堆(因为堆可能更大)来解决 JVM 的限制但实际上它并没有真正解决 -javac(至少从 Java 15 开始)只会出错如果你有 65535 个局部变量或深度为 65535 的堆栈。

\n