![]() |
1
6
由于堆栈的初始状态以及每个指令对其的影响是众所周知的,因此您可以精确地预测在任何时候操作数堆栈上会出现哪种项:
jvm_的验证器将精确地做到这一点,预测每个指令后堆栈的内容,以检查它是否适合作为后续指令的输入。但是在这里有一个声明的最大大小是有帮助的,因此验证器不需要为理论上可能的64K堆栈条目维护动态增长的数据结构或预分配内存。使用声明的最大大小,它可以在遇到推多的指令时停止,因此它从不需要比声明的内存更多的内存。
如您所见,声明的最大堆栈大小在
然而,这并不意味着编译器必须执行这样的指令分析。编译器具有从源代码派生的更高级别的代码模型,称为 Abstract syntax tree . 这个结构将被用来生成所得到的字节码,并且它可能已经能够预测该级别上所需的堆栈大小。但是编译器实际上是如何做到的,这取决于实现。 |