我知道Java的方法不能大于64 KB。该限制导致我们使用JavaCC语法生成代码时出现问题。我们遇到了Java 6的问题,并且能够通过更改语法来解决这个问题。是否已针对Java 7更改了限制,还是计划用于Java 8?
只是说清楚。我自己不需要大于64 KB的方法。但我写了一个语法,编写了一个非常大的方法。
答案 0 :(得分:53)
根据JVMS7:
end_pc独占的事实是一个历史错误 Java虚拟机的设计:如果是Java虚拟机代码 对于一个方法,正好是65535字节长,并以一条指令结束 这是1个字节长,然后该指令不能被a保护 异常处理程序编译器编写者可以解决这个问题 限制生成的Java虚拟机代码的最大大小 对于任何方法,实例初始化方法或静态初始化程序 (任何代码数组的大小)为65534字节。
但这是关于Java 7
。 Java 8没有最终规范,所以没有人(除了它的开发人员)可以回答这个问题。
UPD(2015-04-06)根据JVM8 Java 8
也是如此。
答案 1 :(得分:9)
好问题。我们一如既往地去the source寻找答案("The Java® Virtual Machine Specification")。该部分没有明确提及限制(Java6 VM规范也是如此),但有点谨慎:
在调用方法(第2.6节)时创建的帧的局部变量数组中最大数量的局部变量被Code35属性(第4.7.3节)的max_locals项的大小限制为65535,给出了该方法的代码,以及Java虚拟机指令集的16位局部变量索引。
干杯,
答案 2 :(得分:7)
它没有改变。在Java 7和Java 8中,方法中的代码限制仍为64 KB。
<强>参考文献:强>
类文件中Java虚拟机代码的静态约束指定方式 必须在代码数组中布置Java虚拟机指令以及什么 个别指示的操作数必须是。
代码数组中指令的静态约束如下:
- 代码数组不能为空,因此code_length项不能为 价值0。
- code_length项的值必须小于65536。
code_length项的值给出代码数组中的字节数 对于这种方法。
code_length的值必须大于零(因为代码数组必须 不是空的)并且小于65536。
答案 3 :(得分:1)
Andremoniy已经回答了这个问题的java 7
部分,但当时似乎很快就会决定java 8
所以我完成了覆盖该部分的答案:
引自jvms:
end_pc是独占的这一事实是Java虚拟机设计中的历史错误:如果方法的Java虚拟机代码正好是65535字节长并且以1字节长的指令结束,那么该指令不能被异常处理程序保护。编译器编写器可以通过将任何方法,实例初始化方法或静态初始化程序(任何代码数组的大小)生成的Java虚拟机代码的最大大小限制为65534字节来解决此错误。
如您所见,至少在此版本(java 8)中,这个历史问题似乎无法弥补。
答案 4 :(得分:-1)
作为一种解决方法,和您可以访问解析器的代码,您可以修改它以在JVM编译器强加的任何限制内工作...... (假设它不需要永远找到解析器代码中要修改的部分)