問題:8000バイトを超えるJavaバイトコードにコンパイルする方法があります。 HotSpotには、8000バイトを超えるメソッドに対してJITを起動させないという魔法の限界があります。このメソッドはライブラリ内にあり、ライブラリのユーザがマジックリミットを無効にするためにHotSpotを設定する必要はありません。不要なgotosを取り除くJavaバイトコードオプティマイザはありますか?
観測:バイトコードを逆コンパイルすると、Eclipse Javaコンパイラが多くの無意味なものを生成することがわかります。 (javacはさらに悪いです)。つまりジャンプだけで到達可能なものがあります。明らかに、ジャンプ先にジャンプするジャンプは、ジャンプ先がジャンプ先にジャンプし、ジャンプ先を削除する必要があります。
質問:Java 5クラスファイルのためのバイトコードオプティマイザがありますが、無意味なジャンプチェーンを平らにし、不必要なgotosを削除しますか?
編集:
8698: goto 8548
8701: goto 0
明らかに、第二のgotoのみだけでなく秒で0
に直接ジャンプかもしれない8701へのジャンプで到達することができます。私のようなパターンを意味します調査は、この疑わしいパターンがより一般的です:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
明らかには、1が870にジャンプし、コンパイラは「等しくない」の比較に「等しい」の比較を逆にしたいと思います4とgotoを削除します。
いくつかのアーキテクチャでは、(8ビットまたは16ビットのレジスタにアドレスを保持するため)相対分岐がどこまで行くことができるかに制限があります。そのため、相対分岐を使用して、プログラムカウンタサイズ。 JVMはそうですか? –
* LABELS *はジャンプからのみ到達可能ですか? –
JVMにヒントを与えるランタイムアノテーションは、この場合はすばらしいと思われます....しかし、私はそのようなものは存在しないと思っています(そして、素早くグーグルが何も出てこない)。 – Jared