只是为了明确。我自己不需要一个超过64KB的方法。但我编写了一个编译成非常大方法的语法。
很好的问题。我们应该去源头查找答案("Java®虚拟机规范")。尽管本节没有明确提到限制(与Java6 VM规范不同),但有点含蓄地说:
在调用方法(§2.6)时创建的帧中的局部变量数组中的局部变量数量由Code属性(§4.7.3)的max_locals项的大小和Java虚拟机指令集的16位局部变量索引限制,最大为65535。
祝好!
code_length项的值给出了此方法中代码数组中的字节数。
code_length的值必须大于零(因为代码数组不能是空的),并且小于65536。
Andremoniy已经回答了这个问题的java 7
部分,但似乎当时还没有决定关于java 8
的问题,所以我来补充一下答案以涵盖这部分:
引用自jvms:
end_pc是排除在外的事实,在Java虚拟机的设计中是一个历史性错误:如果方法的Java虚拟机代码恰好长65535字节,并以一个长度为1字节的指令结尾,则该指令不能由异常处理程序保护。编译器编写者可以通过将生成的Java虚拟机代码的最大大小限制为任何方法、实例初始化方法或静态初始化程序(任何代码数组的大小)65534字节来解决此错误。
正如您所看到的,这个历史性问题在这个版本(java 8)中似乎并没有得到解决。
作为一种权宜之计,如果你可以访问解析器的代码,你可以修改它以适应JVM编译器所施加的任何限制... (假设在解析器代码中找到要修改的部分不会耗费太长时间)