Java 7和8中方法的最大大小

时间:2013-07-02 09:51:07

标签: java java-7 java-8

我知道Java的方法不能大于64 KB。该限制导致我们使用JavaCC语法生成代码时出现问题。我们遇到了Java 6的问题,并且能够通过更改语法来解决这个问题。是否已针对Java 7更改了限制,还是计划用于Java 8?

只是说清楚。我自己不需要大于64 KB的方法。但我写了一个语法,编写了一个非常大的方法。

5 个答案:

答案 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。

<强>参考文献:

  1. 来自Java 7虚拟机规范(4.9.1 Static Constraints):
  2.   

    类文件中Java虚拟机代码的静态约束指定方式   必须在代码数组中布置Java虚拟机指令以及什么   个别指示的操作数必须是。

         

    代码数组中指令的静态约束如下:

         
        
    • 代码数组不能为空,因此code_length项不能为   价值0。
    •   
    • code_length项的值必须小于65536。
    •   
    1. 来自Java 8虚拟机规范(4.7.3 The Code Attribute):
    2.   

      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编译器强加的任何限制内工作...... (假设它不需要永远找到解析器代码中要修改的部分)