最近一直在阅读有关JVM内部的内容,并对其中一个元素 - 方法的操作数堆栈有疑问。它是否有最大尺寸,我们可以溢出吗?我们可以手动完成或者可能导致什么条件吗?
答案 0 :(得分:1)
使用MaxStack属性为每个方法设置最大大小。创建一个更大的操作数堆栈(或不确定大小的操作数堆栈)会导致验证错误,因此在某种意义上,您无法真正动态地溢出它,它是正确的(保持在限制范围内)或者甚至不会加载。 / p>
由于MaxStack属性的类型是uint16,因此您可以指定最多为
的操作数堆栈大小
2 16 -1个槽。宽类型占用2个插槽,与局部变量相同。因此,Java中的非常大的表达式在理论上可以是不可编译的,但实际上javac
在此之前的很长一段时间内耗尽了堆栈空间(实际的堆栈空间,而不是操作数堆栈)。
当属性设置不正确时,超出MaxStack属性设置的限制很容易,当使用ClassWriter时没有经过足够的注意,这种情况偶尔发生。