最近一直在阅读有关 JVM 内部结构的内容,并且对其其中一个元素(方法的操作数堆栈)有疑问。它有最大尺寸吗?我们可以溢出它吗?我们可以手动执行吗?或者什么情况可能导致它?
最佳答案
每个方法的最大大小是通过 MaxStack 属性设置的。创建更大的操作数堆栈(或不确定大小的操作数堆栈)会导致验证错误,因此从某种意义上说,您不能真正动态地溢出它,它要么是正确的(保持在限制内),要么甚至无法加载。
由于 MaxStack 属性的类型是 uint16,因此您可以指定最大操作数堆栈大小
216-1 个插槽。宽类型占用 2 个槽,与局部变量相同。因此,Java 中非常大的表达式理论上可能无法编译,但实际上 javac
在此之前很长时间就耗尽了堆栈空间(实际堆栈空间,而不是操作数堆栈)。
当 MaxStack 属性设置不正确时,很容易超出 MaxStack 属性设置的限制,这种情况在使用 ClassWriter 时不够小心时偶尔会发生。
关于java - Java 方法操作数栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43563928/