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

我知道Java的方法不能超过64 KB。 这个限制使我们遇到了JavaCC语法生成代码的问题。 我们遇到了Java 6的问题,并能够通过改变语法来解决这个问题。 Java 7的限制已经改变,还是计划用于Java 8?

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

根据JVMS7 :

end_pc是独占的事实是Java虚拟机devise中的一个历史性错误:如果一个方法的Java虚拟机代码长度正好是65535字节,并且以1字节长的指令结束,那么该指令不能被保护由一个exception处理程序。 编译器编写者可以通过将任何方法,实例初始化方法或静态初始化程序(任何代码数组的大小)的生成Java虚拟机代码的最大大小限制为65534字节来解决此问题。

但这是关于Java 7Java 8没有最终规范,所以没有人(除开发人员)能够回答这个问题。

UPD(2015-04-06)根据JVM8 , Java 8也是如此。

好问题。 一如既往,我们应该去源头find答案( “Java®虚拟机规范” )。 该部分没有明确提到限制(Java6 VM规范),但有些谨慎:

通过调用方法(§2.6)创build的一个框架的局部variables数组中的局部variables的最大数量受限于Code属性的max_locals项的大小(§4.7.3),限制为65535,方法,并通过Java虚拟机指令集的16位本地variables索引。

干杯,

它没有改变。 在Java 7和Java 8中,方法中的代码限制仍然是64 KB。

参考文献:

  1. 从Java 7虚拟机规范( 4.9.1静态约束 ):

类文件中对Java虚拟机代码的静态约束指定了如何在代码数组中布局Java虚拟机指令以及单个指令的操作数必须是什么。

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

  • 代码数组不能为空,所以code_length项不能为0。
  • code_length项的值必须小于65536。
  1. 从Java 8虚拟机规范( 4.7.3代码属性 ):

code_length项的值给出了此方法的代码数组中的字节数。

code_length的值必须大于零(因为代码数组不能为空)且小于65536。

Andremoniy已经回答了这个问题的java 7部分,但似乎在那个时候很快就决定了java 8所以我完成了覆盖这个部分的答案:

引用jvms :

end_pc是独占的这一事实在Java虚拟机的devise中是一个历史性的错误:如果一个方法的Java虚拟机代码长度正好是65535字节,并且以1字节长的指令结束,那么该指令不能被保护由一个exception处理程序。 编译器编写者可以通过将任何方法,实例初始化方法或静态初始化程序(任何代码数组的大小)生成的Java虚拟机代码的最大大小限制为65534字节来解决此问题。

正如你所看到的似乎这个历史问题至less在这个版本(java 8)似乎并没有补救。

作为一种解决方法, 如果您有权访问parsing器的代码,那么可以修改它以在JVM编译器施加的任何限制内工作…(假设不需要永远在parsing器代码中find部分修改)