为什么Java 6编译后的类大小比Java 5大?

10

我们注意到在Java 6上编译我们的类时,它们的大小始终大于Java 5。

我知道到目前为止字节码没有改变,所以我猜想Java 6编译器添加了更多内容。是否所有这些都是必需的,还是有任何方法可以关闭它并仍然编译Java 6源代码?

2个回答

14
版本6 javac正在生成额外的“Stack Map”属性在类文件中,以使jvm更容易和更快地进行验证。我怀疑这不会产生太大的大小差异,您可以始终使用-target 1.5选项生成与早期版本相同的字节码。
编辑:关于此新属性的详细信息可在jsr 202的第4.8.4节找到。
块引用:

堆栈映射属性是Code属性的属性表中的可变长度属性。该属性的名称为StackMapTable。在类型检查(§4.11.1)的过程中使用此属性。

堆栈映射属性由零个或多个堆栈映射帧组成。每个堆栈映射帧指定了字节码偏移量、本地变量的验证类型(§4.11.1)以及操作数栈的验证类型(明确或隐式)。


这是v6 javac的唯一添加部分吗? - Clark Bao
我猜这可能是JDK 1.5无法运行1.6版本代码的主要原因,除了那些新的类和新特性。 - Clark Bao

2
使用javap命令转储文件内容,查看是否有明显异常。Java 6类文件中可能存在额外的属性。

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