java类/异常表的最大大小

java类/异常表的最大大小,java,class,exception,Java,Class,Exception,我想知道java类的最大大小是多少。如代码属性结构中所示,代码长度指定为4字节,因此它是一个大数字。我不明白的是,异常表的pc属性是2字节。如果代码长度超过2个字节,但异常表只能处理2个字节,它如何工作?异常表将索引到特定方法的代码中,该方法的代码实际上不能超过64k。但是,由于一个类中可能有许多方法,这本身对一个类的大小没有限制。JVM规范说: code_length项的值必须小于65536 因此,尽管它是一个4字节的值,但不能超过64k。所以,我偶然发现了这个值,碰巧感到很无聊,所以我决定尝

我想知道java类的最大大小是多少。如代码属性结构中所示,代码长度指定为4字节,因此它是一个大数字。我不明白的是,异常表的pc属性是2字节。如果代码长度超过2个字节,但异常表只能处理2个字节,它如何工作?

异常表将索引到特定方法的代码中,该方法的代码实际上不能超过64k。但是,由于一个类中可能有许多方法,这本身对一个类的大小没有限制。

JVM规范说:

code_length
项的值必须小于
65536


因此,尽管它是一个4字节的值,但不能超过64k。

所以,我偶然发现了这个值,碰巧感到很无聊,所以我决定尝试一下。(在四元Xeon MacPro 1,1上运行Java 1.6.0_26)

事实证明,Eclipse至少承认了一个限制,即一个方法中不能超过65535字节。然而,由于某种原因,这只适用于主方法和构造函数方法,而不适用于普通类方法。一旦main和constructor方法低于65K,代码就可以毫无问题地运行了。Eclipse在处理这样大的方法时遇到了一些问题(100%的cpu占用几秒钟,错误图标重影会留在编辑器中),但代码实际上运行得很好

我添加了5个额外的方法,它们都有至少100K的代码(大部分是乱七八糟的System.out.println(“blah”)),这些方法本身使用了一些参数,并返回了一个值。所以它们是我能做的最“正常”的。我试过几次,它们都跑得很好

所以,看起来确实有65K的限制,但它肯定不是绝对类大小,它显然只适用于“特殊”方法,如main或constructor方法

然而,至少在我的例子中,更大的问题是Eclipse无法处理这些类型的文件。CPU开始变为100%,整个IDE似乎有时会冻结。大多数时候,Eclipse看起来只是在重新计算语法高亮显示(!)。系统的其余部分至少在这段时间内是有响应的,我想这更多地说明了OSX而不是Java

当然,我无法理解你为什么会接近这些极限。理性和常识,如果不是OO原则,早在接近65K之前就应该考虑到这一点。但这是一个很好的实验,嘿,我学到了一些东西

仅供参考,以下是我测试的内容:

~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03-383-11A511)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-383, mixed mode)

但是code属性已经属于method,这意味着method的代码长度可以指定为4字节,大于64kNo,不能,请参见Joachims的答案。还有其他短尺寸实体在方法中处理偏移。在minecraft forge中生成巨大的自动生成结构将触发64k警告。必须将决定如何将结构构建到不同方法中的指令分开。我知道如何生成类型签名比此长度更长的表达式->