java - Java 方法操作数栈

标签 java stack-overflow operands

最近一直在阅读有关 JVM 内部结构的内容,并且对其其中一个元素(方法的操作数堆栈)有疑问。它有最大尺寸吗?我们可以溢出它吗?我们可以手动执行吗?或者什么情况可能导致它?

最佳答案

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

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

当 MaxStack 属性设置不正确时,很容易超出 MaxStack 属性设置的限制,这种情况在使用 ClassWriter 时不够小心时偶尔会发生。

关于java - Java 方法操作数栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43563928/

相关文章:

c++ - 二进制表达式错误消息的无效操作数

linux - cat `-q` 文件(在 linux 中)- 传递看起来像选项的操作数

java - 第二个 servlet 不调用 WebService

java - 异步构建 Hibernate Search 索引以确保不会停机。

python - 如何增加 Python 中的最大递归深度?

android - 使用 koin 注入(inject) UseCase 时,方法在 android 中引发 'java.lang.StackOverflowError' 异常

c - ubuntu上的堆栈执行保护和随机化

java - 如何将 Stream Stream<HashMap<String, Object>> 转换为 HashMap Array HashMap<String, Object>[]?

java - 如何为 requestbody 发送自定义验证 Json 对象?

c++ - 错误 : invalid operands of types 'float' and 'int' to binary 'operator^'