83

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

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

4

5 回答 5

60

根据JVMS7

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

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

UPD (2015-04-06)根据JVM8,对于Java 8.

于 2013-07-02T09:57:15.850 回答
11

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

在调用方法(第 2.6 节)时创建的帧的局部变量数组中的最大局部变量数被 Code 属性(第 4.7.3 节)的 max_locals 项的大小限制为 65535,给出了代码方法,并通过 Java 虚拟机指令集的 16 位局部变量索引。

干杯,

于 2013-07-02T09:58:44.520 回答
8

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

参考:

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

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

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

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

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

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

于 2015-01-15T01:30:11.490 回答
1

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

引用jvms

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

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

于 2014-03-25T15:25:13.670 回答
-1

作为一种解决方法,如果您可以访问解析器的代码,您可以修改它以在 JVM 编译器施加的任何“限制”内工作......(假设不需要永远在解析器代码中找到部分调整)

于 2013-07-02T21:49:08.630 回答