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

Vic*_*azi 10 java bytecode class javac

我们注意到,当我们在Java 6上编译类时,它们总是比Java 5大.

我知道到目前为止还没有对字节代码进行任何更改,所以我认为Java 6编译器会引入更多内容.这是所有必需的,还是有任何方法可以关闭它仍然编译Java 6源代码?

Jör*_*ann 14

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

编辑:有关此新属性的详细信息,请参见jsr 202的 4.8.4节

4.8.4 StackMapTable属性

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

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