我們注意到,當我們在Java 6上編譯我們的類時,它們始終大於Java 5.爲什麼Java 6編譯的類的大小比Java 5大?
我知道迄今爲止還沒有對字節碼進行更改,所以我假設Java 6編譯器正在投入更多的東西。這是否都是必需的,或者有什麼方法可以關閉它並仍然編譯Java 6源代碼?
我們注意到,當我們在Java 6上編譯我們的類時,它們始終大於Java 5.爲什麼Java 6編譯的類的大小比Java 5大?
我知道迄今爲止還沒有對字節碼進行更改,所以我假設Java 6編譯器正在投入更多的東西。這是否都是必需的,或者有什麼方法可以關閉它並仍然編譯Java 6源代碼?
版本6的javac在類文件中生成額外的「堆棧映射」屬性,以便通過jvm更容易和更快地進行驗證。我懷疑這個數量太大,你可以使用-target 1.5
選項來使它產生與之前版本相同的字節碼。
編輯:可在節4.8.4中找到的jsr 202
4.8.4 StackMapTable屬性
堆棧地圖屬性有關此新屬性詳細是一個可變長度的屬性代碼 屬性的屬性表。屬性的名稱是StackMapTable。這個屬性用於 通過類型檢查驗證的過程(§4.11.1)。
堆棧映射屬性由零個或多個堆棧映射幀組成。每個堆棧映射幀(明確地或隱含地)指定字節碼偏移量,驗證本地變量的類型(§4.11.1),以及操作數 棧的驗證類型。
使用javap
命令轉儲文件的內容以查看是否有任何顯而易見的突出顯示。 Java 6類文件中可能會有一些額外的屬性。
這是v6 javac唯一添加的部分嗎? – 2011-08-16 14:26:00
我想這可能是JDK 1.5除了那些新類和新功能之外不能運行1.6版代碼的主要原因。 – 2011-08-16 14:29:18