Java方法操作数堆栈
我最近一直在阅读JVM的内部结构,对其中的一个元素——方法的操作数堆栈——有疑问。它是否有一个最大大小,我们可以溢出它吗?我们可以手动执行吗?或者是什么条件导致的?每个方法的最大大小都设置为MaxStack属性。创建更大的操作数堆栈或不确定大小的操作数堆栈会导致验证错误,因此在某种意义上,您不能真正动态地使其溢出,它要么在限制内正确,要么甚至不加载 由于MaxStack属性的类型为uint16,因此可以指定最大为的操作数堆栈大小 216-1个插槽。宽类型占用2个插槽,与局部变量相同。因此,Java中真正大的表达式在理论上是不可编译的,但在实践中,javac耗尽了堆栈空间—实际堆栈空间,而不是操作数堆栈—在此之前很长一段时间Java方法操作数堆栈,java,stack-overflow,operands,Java,Stack Overflow,Operands,我最近一直在阅读JVM的内部结构,对其中的一个元素——方法的操作数堆栈——有疑问。它是否有一个最大大小,我们可以溢出它吗?我们可以手动执行吗?或者是什么条件导致的?每个方法的最大大小都设置为MaxStack属性。创建更大的操作数堆栈或不确定大小的操作数堆栈会导致验证错误,因此在某种意义上,您不能真正动态地使其溢出,它要么在限制内正确,要么甚至不加载 由于MaxStack属性的类型为uint16,因此可以指定最大为的操作数堆栈大小 216-1个插槽。宽类型占用2个插槽,与局部变量相同。因此,Jav
当属性设置不正确时,很容易超过MaxStack属性设置的限制,当使用ClassWriter时,有时会出现这种情况。最大大小由分配给JVM的内存减去已经在使用的内存表示。这是否意味着如果我们创建的方法太大,会在编译时导致验证错误?@Amarnatharish这意味着如果一个方法需要太多的内存如果创建了堆栈项,它甚至不能编译为类文件,因为大型局部变量数组和操作数堆栈是不可能的。我明白了。为什么买堆叠空间比堆叠框架先被剥夺?