为什么Java将方法的大小限制为65535字节?

Kon*_*itz 19 java

我刚刚编译了以下代码

public class A {
    public static void main(String... args) {
        int i = 3;
        ++i; 
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        ++i;
        // repeat writing the expression ++i for 20,000 times

        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

并收到以下错误消息

方法main(String ...)的代码超过65535字节限制

为什么Java实现此限制?我没有看到理性,因为Java确实包含了goto_w指令.

Whi*_*g34 26

请参阅Java虚拟机规范部分4.10:

4.10 Java虚拟机的限制

  • 每个非本机非抽象方法的代码量由Code属性(第4.7.3节)的exception_table中的索引大小限制为65536字节,在LineNumberTable属性(第4.7.8节)中,在LocalVariableTable属性中(§4.7.9).

在面向对象的编程语言中使用长方法几乎没有什么好的理由.

  • 实际上有一个很好的理由......代码生成.http://www.velocityreviews.com/forums/t146001-reached-the-65535-bytes-limit.html (21认同)
  • @WhiteFang - 当然,这将是"太多"的复杂性而不是,我们无法想象一个程序真的需要超过640k的记忆,我们可以吗? (5认同)
  • @Ingo,在某种程度上,我们总是要担心尺寸.现代语言经常隐藏这一点,但这并不意味着没有做出权衡.例如,我们应该允许多大的URL?(见http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url) (5认同)
  • 无论这个决定的原因是什么 - 想法"我们在某个地方会有64k的限制." 应该是惊人的.在过去的几年中,我们没有看到什么限制!经验表明,每当有人想到:这应该绰绰有余!几年后他被伪造了. (4认同)
  • 是的,我知道人们在JSP文件中达到了这个限制.我仍然不认为这是一个很好的理由.这意味着几乎可以肯定,单个JSP文件中的复杂性太高了. (2认同)
  • @WhiteFang - 事实是它并不仅限于"糟糕的设计".它不限制任何东西,它只是让一些东西更笨拙.你是谁,你认为你知道它的设计很差,如果它的64k?然后你可以向我解释为什么即使是中等大小的解析器表是"糟糕的设计",也不能在一个静态方法中设置? (2认同)
  • @Ingo:好吧,我想对于生成像JavaCC这样的代码的工具有一些争论.然后,只需要额外的工作来生成绕过限制的代码.他们是否试图在规范中每个偏移量保存2个字节,或者有更深层次的原因,我不知道.无论哪种方式,我认为它不像640k内存限制那样令人担忧. (2认同)
  • @Ingo:很公平,我在答案中将"不"更改为"少数":) (2认同)
  • 就此而言,为什么要将stackoverflow注释限制为600个字符? (2认同)