2011-04-12 63 views
10

我们注意到,当我们在Java 6上编译我们的类时,它们始终大于Java 5.为什么Java 6编译的类的大小比Java 5大?

我知道迄今为止还没有对字节码进行更改,所以我假设Java 6编译器正在投入更多的东西。这是否都是必需的,或者有什么方法可以关闭它并仍然编译Java 6源代码?

回答

14

版本6的javac在类文件中生成额外的“堆栈映射”属性,以便通过jvm更容易和更快地进行验证。我怀疑这个数量太大,你可以使用-target 1.5选项来使它产生与之前版本相同的字节码。

编辑:可在节4.8.4中找到的jsr 202

4.8.4 StackMapTable属性

堆栈地图属性有关此新属性详细是一个可变长度的属性代码 属性的属性表。属性的名称是StackMapTable。这个属性用于 通过类型检查验证的过程(§4.11.1)。

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

+0

这是v6 javac唯一添加的部分吗? – 2011-08-16 14:26:00

+0

我想这可能是JDK 1.5除了那些新类和新功能之外不能运行1.6版代码的主要原因。 – 2011-08-16 14:29:18

2

使用javap命令转储文件的内容以查看是否有任何显而易见的突出显示。 Java 6类文件中可能会有一些额外的属性。