Java 虚拟机的以下限制隐含在
类文件格式:
每个类或每个接口的常量池限制为 65535
ClassFile 的 16 位 constant_pool_count 字段的条目
结构(§4.1)。这是对总数的内部限制
单个类或接口的复杂性。
一个类或接口可以声明的字段数是
受 ClassFile 的 fields_count 项的大小限制为 65535
结构(§4.1)。
注意ClassFile的fields_count项的值
结构不包括从超类继承的字段
或超级接口。
一个类或接口可以声明的方法的数量是
限制为 65535 的 methods_count 项的大小
类文件结构(第 4.1 节)。
注意ClassFile的methods_count项的值
结构不包括继承自的方法
超类或超接口。
一个类或接口的直接超接口的数量是
限制为 65535 的 interfaces_count 项的大小
类文件结构(第 4.1 节)。
局部变量数组中的最大局部变量个数
在调用方法(第 2.6 节)时创建的框架限制为 65535
按 Code 属性的 max_locals 项的大小(第 4.7.3 节)
给出方法的代码,并由 16 位局部变量
Java 虚拟机指令集的索引。
请注意,long 和 double 类型的值都被认为是
保留两个局部变量并贡献两个单位
max_locals 值,因此进一步使用这些类型的局部变量
减少这个限制。
帧中操作数堆栈的大小(第 2.6 节)限制为 65535
Code 属性的 max_stack 字段的值(第 4.7.3 节)。
请注意,long 和 double 类型的值都被认为是
为 max_stack 值贡献两个单位,因此使用
操作数栈上的这些类型进一步降低了这个限制。
方法参数的数量被定义为255个
方法描述符(§4.3.3),其中限制包括一个单位
this 在实例或接口方法调用的情况下。
请注意,方法描述符是根据以下概念定义的
方法参数长度,其中 long 或 double 类型的参数
为长度贡献两个单位,因此这些类型的参数
进一步降低限制。
字段和方法名称、字段和方法描述符的长度,
和其他常量字符串值(包括那些由
ConstantValue(第 4.7.2 节)属性)被限制为 65535 个字符
CONSTANT_Utf8_info 结构的 16 位无符号长度项
(§4.4.7)。
请注意,限制是编码中的字节数,而不是
关于编码字符的数量。 UTF-8 编码一些字符
使用两个或三个字节。因此,包含多字节的字符串
字符被进一步限制。
数组的维数限制为 255
multianewarray 指令的维度操作码和
对 multianewarray、anewarray 和 newarray 施加的约束
说明(第 4.9.1 节、第 4.9.2 节)。