Java7和 Java8中方法的最大大小

我知道使用 Java 的方法不能大于64KB。这个限制给我们带来了从 JavaCC语法生成的代码的问题。我们在 Java6中遇到了一些问题,可以通过改变语法来解决这个问题。Java7的限制是否已经更改,还是计划在 Java8中更改?

我只是想说清楚。我不需要一个大于64KB 的方法。但是我写了一个语法,它可以编译成一个非常大的方法。

22575 次浏览

根据 JVMS7:

End _ pc 是独占的事实是 设计 Java 虚拟机: 如果 Java 虚拟机代码 方法的字节长度正好为65535字节,并以指令结束 则该指令不能由 编译器编写器可以通过以下方式解决此错误 限制生成的 Java 虚拟机代码的最大大小 对于任何方法、实例初始化方法或静态初始化器 (任何代码数组的大小)为65534字节。

但这是关于 Java 7Java8没有最终的规范,所以没有人(除了它的开发人员)可以回答这个问题。

UPD (2015-04-06) 根据 JVM8Java 8也是如此。

问得好。像往常一样,我们应该去 源头找答案(Java 虚拟机规范)。不过,本节并没有明确提到限制(正如 Java6VM 规范所做的那样) ,而是有些谨慎地提到:

一个框架的局部变量数组中的局部变量的最大数量是通过调用一个方法(2.6)被限制为65535,这取决于给出该方法代码的 Code 属性(4.7.3)的 max _ local 项的大小,以及 Java Virtual 指令集的16位局部变量索引。

干杯,

作为一个解决方案,如果你可以访问解析器的代码,你可以修改它,使其在 JVM 编译器强加的任何限制范围内工作..。 (假设在解析器代码中找到需要修改的部分不需要很长时间)

安德烈莫尼已经回答了这个问题的 java 7部分,但似乎在那个时候,它很快就决定关于 java 8,所以我完成的答案,以涵盖这一部分:

引自 Jvms:

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

正如你所看到的,这个历史问题似乎至少在这个版本中没有得到解决(java 8)。

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

参考文献:

  1. 来自 Java7虚拟机规范(4.9.1静态约束) :

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

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

  • 代码数组不能为空,因此 code _ length 项不能具有 值为0。
  • Code _ length 项的值必须小于65536。
  1. 来自 Java8虚拟机规范(4.7.3代码属性) :

Code _ length 项的值给出代码数组中的字节数 对于这种方法。

Code _ length 的值必须大于零(代码数组必须如此) 不是空的)及少于65536。