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

19

我刚刚编译了以下代码

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);
    }
}

同时得到了以下错误信息

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

为什么Java要实现这个限制?我看不出有理由,因为Java确实包含一个goto_w指令。


2
为什么你需要一个超过65535的方法? - MeBigFatGuy
1个回答

26

参见Java 虚拟机规范第4.10节:

4.10 Java虚拟机的限制

  • 非本地、非抽象方法中的代码量受到限制,不能超过65536个字节。原因是Code属性(§4.7.3)、LineNumberTable属性(§4.7.8)和LocalVariableTable属性(§4.7.9)中索引的大小限制。

在面向对象编程语言中,很少有需要这么长的方法的情况。


21
实际上,存在一个相当不错的理由解释为什么需要使用代码生成来避免代码大小超过65535字节的限制。 - Konstantin Weitz
2
是的,我知道人们在JSP文件中会遇到这个限制。但我仍然不认为这是一个好的理由。这意味着单个JSP文件中几乎肯定存在过多的复杂性。 - WhiteFang34
4
无论做出这个决定的原因是什么-“我们在某个地方会有64k的限制”这个想法应该引起警觉。在过去的几年里,我们没有看到哪些限制已经消失了!经验表明,每当有人认为:“这应该足够了!”几年后他就会被证明是错误的。 - Ingo
5
@WhiteFang - 当然,这会带来“过多”的复杂性,我们不能想象一个程序真正需要超过640k的内存,不是吗? - Ingo
5
@Ingo,在某种程度上,我们总是要担心大小的问题。现代语言经常隐藏了这一点,但这并不意味着没有做出任何权衡。例如,我们应该允许一个URL变得多大?(请参阅https://dev59.com/XHRC5IYBdhLWcg3wFM_W) - Dilum Ranatunga
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接