2011-04-12 40 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類文件中可能會有一些額外的屬性。

相關問題