我理解Single Responsibility Principle的重要性,但从技术上讲,我们对每个java方法中的局部变量(存储在堆栈帧中)的数量有任何上限。并且上限是否等于最大堆栈大小,即,我可以拥有一个大小等于配置的最大堆栈大小的堆栈帧吗?
答案 0 :(得分:5)
定义局部变量的数量没有上限。如果定义了太多无法放入堆栈框架的变量(或)JVM无法为该大小分配堆栈框架,它将抛出StackOverflowError
并退出。
斯坦福教授对lecture有好处,可以帮助你。
答案 1 :(得分:3)
这将由您的运行时确定,每个进程分配多少堆栈空间。
答案 2 :(得分:0)
对于这个明确的问题缺乏直接答案,我感到惊讶,所以去了: JVM的最大帧大小为65535个本地变量,最大堆栈大小为65535,其中long
和{ {1}}每个条目占用2个广告位。根据JVM规范4.11. Limitations of the Java Virtual Machine:
在调用方法(第2.6节)时创建的框架的局部变量数组中,局部变量的最大数目受Code属性(第4.7.3节)的max_locals项的大小限制为65535。 )给出该方法的代码,并通过Java虚拟机指令集的16位局部变量索引。
请注意,long和double类型的值均被视为保留两个局部变量,并向max_locals值贡献两个单位,因此使用这些类型的局部变量会进一步减小此限制。
通过Code属性(第4.7.3节)的max_stack字段,将一帧中的操作数堆栈(第2.6节)的大小限制为65535个值。
请注意,long和double类型的值分别被认为对max_stack值贡献了两个单位,因此在操作数堆栈上使用这些类型的值会进一步减小此限制。
从理论上讲,Java语言可以通过将本地变量和堆栈卸载到堆上来解决此JVM限制(因为这可能会更大 waay ),但实际上却不是-{{1 }}(至少从Java 15开始),如果您有65535个本地用户或深度为65535的堆栈,则会出错。