Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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_Stack Overflow_Operands - Fatal编程技术网

Java方法操作数堆栈

Java方法操作数堆栈,java,stack-overflow,operands,Java,Stack Overflow,Operands,我最近一直在阅读JVM的内部结构,对其中的一个元素——方法的操作数堆栈——有疑问。它是否有一个最大大小,我们可以溢出它吗?我们可以手动执行吗?或者是什么条件导致的?每个方法的最大大小都设置为MaxStack属性。创建更大的操作数堆栈或不确定大小的操作数堆栈会导致验证错误,因此在某种意义上,您不能真正动态地使其溢出,它要么在限制内正确,要么甚至不加载 由于MaxStack属性的类型为uint16,因此可以指定最大为的操作数堆栈大小 216-1个插槽。宽类型占用2个插槽,与局部变量相同。因此,Jav

我最近一直在阅读JVM的内部结构,对其中的一个元素——方法的操作数堆栈——有疑问。它是否有一个最大大小,我们可以溢出它吗?我们可以手动执行吗?或者是什么条件导致的?

每个方法的最大大小都设置为MaxStack属性。创建更大的操作数堆栈或不确定大小的操作数堆栈会导致验证错误,因此在某种意义上,您不能真正动态地使其溢出,它要么在限制内正确,要么甚至不加载

由于MaxStack属性的类型为uint16,因此可以指定最大为的操作数堆栈大小 216-1个插槽。宽类型占用2个插槽,与局部变量相同。因此,Java中真正大的表达式在理论上是不可编译的,但在实践中,javac耗尽了堆栈空间—实际堆栈空间,而不是操作数堆栈—在此之前很长一段时间


当属性设置不正确时,很容易超过MaxStack属性设置的限制,当使用ClassWriter时,有时会出现这种情况。

最大大小由分配给JVM的内存减去已经在使用的内存表示。这是否意味着如果我们创建的方法太大,会在编译时导致验证错误?@Amarnatharish这意味着如果一个方法需要太多的内存如果创建了堆栈项,它甚至不能编译为类文件,因为大型局部变量数组和操作数堆栈是不可能的。我明白了。为什么买堆叠空间比堆叠框架先被剥夺?