java类/exception表的最大大小

我想知道java类的最大大小是多少。 如此处所示http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546在Code属性结构中,代码长度指定为4字节,因此它是一大堆。 我不明白的是exception表的pc属性是2个字节。 如果代码长度超过2个字节但exception表只能解决2个字节,它怎么能工作?

§4.8.1JVM规范的静态约束说:

code_length项的值必须小于65536

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

所以,我偶然发现了这件事并且碰巧感到无聊,所以我决定尝试一下。 (在quad-Xeon MacPro 1,1上运行Java 1.6.0_26)

事实certificate,Eclipse至少承认了一个限制,称一个方法中不能超过65,535个字节。 但是,由于某种原因,这仅适用于main方法和构造函数方法,而不适用于普通的类方法。 一旦main和构造函数方法低于65K,代码运行没有问题。 Eclipse在处理如此大的方法时遇到了一些问题(100%cpu几秒钟,错误图标鬼将留在编辑器上),但代码实际运行得很好。

我添加了另外5个方法,这些方法都至少有100K的代码(主要是乱码的System.out.println(“blah”)),并且方法本身使用了一些参数,并返回了一个值。 所以他们就像我能做到的那样“正常”。 我尝试过几次运行它们,它们总是跑得很好。

所以,看起来确实有65K的限制,但绝对不是绝对的类大小,它显然只适用于主要或构造方法等“特殊”方法。

但是,至少就我而言,更大的问题是Eclipse无法处理这些类型的文件。 CPU开始达到100%,整个IDE似乎有时会冻结。 大多数时候,看起来Eclipse只是重新计算语法高亮(!)。 系统的其余部分至少在那段时间内都是响应式的,我想这更多关于OS X而不是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) 

exception表索引到特定方法的代码中,其代码确实不能超过64k。 但由于类中可能有许多方法,因此本身对类的大小没有限制。