我理解单一责任原则的重要性,但从技术上讲,我们对每个java方法中的局部变量(存储在堆栈帧中)的数量有任何上限.并且上限是否等于最大堆栈大小,即,我可以使用大小等于配置的最大堆栈大小的堆栈帧吗?
定义局部变量的数量没有上限.如果定义了太多无法放入堆栈框架的变量(或)JVM无法为该大小分配堆栈框架,它将抛出StackOverflowError并退出.
斯坦福教授有很好的讲座,可以帮助你.
我对这个明确的问题缺乏直接答案感到惊讶,所以这里是:JVM 的最大帧大小为 65535 个本地变量,最大堆栈大小为 65535,每个条目long消耗double2 个插槽。来自 JVM 规范4.11。Java虚拟机的局限性:
\n\n\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
理论上,Java 语言可以通过将本地变量和堆栈卸载到堆(因为堆可能更大)来解决 JVM 的限制,但实际上它并没有真正解决 -javac(至少从 Java 15 开始)只会出错如果你有 65535 个局部变量或深度为 65535 的堆栈。
| 归档时间: |
|
| 查看次数: |
2048 次 |
| 最近记录: |