我想知道java类的最大大小是多少。如此处所示http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546在Code属性结构中,代码长度指定为4字节,因此它是一个很大的数字。我不明白的是异常表的pc属性是2个字节。如果代码长度超过2个字节但异常表只能解决2个字节?
,它怎么能工作?答案 0 :(得分:11)
答案 1 :(得分:4)
异常表索引到特定方法的代码,其代码确实不能超过64k。但由于类中可能有许多方法,因此本身对类的大小没有限制。
答案 2 :(得分:4)
所以,我偶然发现了这件事并且碰巧感到无聊,所以我决定尝试一下。 (在quad-Xeon MacPro 1,1上运行Java 1.6.0_26)
事实证明,Eclipse至少承认了一个限制,称一个方法中的字节数不能超过65,535个字节。但是,由于某种原因,这仅适用于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)