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

时间:2011-04-12 14:43:47

标签: java class bytecode javac

我们注意到,当我们在Java 6上编译类时,它们一直比Java 5大。

据我所知,到目前为止还没有对字节代码进行任何更改,所以我假设Java 6编译器正在投入更多内容。这是所有必需的,还是有任何方法可以关闭它并仍然编译Java 6源代码?

2 个答案:

答案 0 :(得分:14)

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

修改:有关此新属性的详细信息,请参见jsr 202

的第4.8.4节
  

4.8.4 StackMapTable属性

     

堆栈映射属性是代码的属性表中的可变长度属性   属性。属性的名称是StackMapTable。在此期间使用此属性   通过类型检查进行验证的过程(§4.11.1)。

     

堆栈映射属性由零个或多个堆栈映射帧组成。每个堆栈图   frame指定(显式或隐式)字节码偏移,验证   类型(第4.11.1节)用于局部变量,以及操作数的验证类型   叠加。

答案 1 :(得分:2)

使用javap命令转储文件的内容,以查看是否有明显的突出显示。 Java 6类文件中可能还有一些额外的属性。