【发布时间】:2011-03-31 09:07:17
【问题描述】:
我想知道 java 类的最大大小是多少。如这里代码属性结构中http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546所示,代码长度被指定为4字节,所以它是一个很大的数字。我不明白的是异常表的pc属性是2个字节。如果代码长度超过 2 字节,但异常表只能处理 2 字节,它如何工作?
【问题讨论】:
我想知道 java 类的最大大小是多少。如这里代码属性结构中http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546所示,代码长度被指定为4字节,所以它是一个很大的数字。我不明白的是异常表的pc属性是2个字节。如果代码长度超过 2 字节,但异常表只能处理 2 字节,它如何工作?
【问题讨论】:
所以,我偶然发现了这个并且碰巧很无聊,所以我决定尝试一下。 (在 Quad-Xeon MacPro 1,1 上运行 Java 1.6.0_26)
事实证明,至少 Eclipse 承认了一个限制,即方法中不能超过 65,535 个字节。但是,由于某种原因,这仅适用于 main 方法和构造函数方法,不适用于普通类方法。一旦 main 和 constructor 方法低于 65K,代码运行就没有问题了。 Eclipse 在处理这么大的方法时遇到了一些问题(100% cpu 几秒钟,错误图标鬼会留在编辑器上),但代码实际上运行得很好。
我添加了 5 个额外的方法,它们都有至少 100K 的代码(大部分都是胡言乱语 System.out.println("blah")),并且这些方法本身使用了一些参数,并返回了一个值。所以它们就像我能做的一样“正常”。我试着运行了几次,它们总是运行得很好。
所以,看起来确实有 65K 的限制,但绝对不是绝对类大小,而且它显然只适用于“特殊”方法,如 main 或构造方法。
但是,至少就我而言,更大的问题是 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)
【讨论】:
【讨论】:
异常表索引到特定方法的代码,其代码确实不能超过64k。但是由于一个类中可能有很多方法,这本身就对类的大小没有限制。
【讨论】: