2011-08-02 7 views
26

Javaジャストインタイムコンパイラによって生成されたネイティブコードのアセンブリダンプを実行する方法はありますか?Java JITコンパイル済みネイティブバイトコードを逆アセンブルする

関連する質問:コードをネイティブマシンコードにコンパイルするためにJVMを実行せずにJITコンパイラを使用する方法はありますか?

+0

Heresy!ナー、冗談だよ。興味深い質問! +1 –

+0

この「ジャストインタイム」コンパイルコードにはどのようにアクセスできますか?実行時に実行中であるため、アセンブリダンプを実行するためにアクセスする方法が不思議です... –

+3

最初の質問は奇妙ですが、2番目の質問はその件に関する読書を行うべきだと示唆しています。 JITコンパイルは、実行時にのみ利用可能な情報に依存しているため、MP3エンコーダーを使用して、最初に録音することなくソングをエンコードする方法があるかどうかを確認するようなものです。 – entonio

答えて

16

はい、there is a way生成されたネイティブコードを印刷するには(OpenJDK 7が必要です)。

いいえ、JDKのJITを使用してJavaバイトコードをネイティブコードにコンパイルしてネイティブ実行可能ファイルとして保存する方法はありません。

これが可能であったとしても、おそらくあなたが考えるほど有用ではないでしょう。 JVMはいくつかの非常に洗練された最適化を行い、必要に応じてオンザフライでコードを最適化解除することさえできます。言い換えれば、JITがコードをネイティブの機械語にコンパイルするのと同じくらい簡単ではないので、そのネイティブの機械語は、プログラムの実行中は変更されません。また、JVMとランタイムライブラリとは独立したネイティブの実行可能ファイルを作成することもできません。

2

JITを使用してスタンドアロンの実行可能ファイルを作成することはできません。GCJのような他のシステムが必要です。 JITで生成されたコードを見る限り、OpenJDKソースをチェックしてデバッグオプションを探します。有効にしたもので独自のコピーを作成し、JITが何をしているのかを確認したり、独自の拡張機能を追加して好きなものを出力することができます。

3

もしAmigable Clark Kantがあなたの質問が異端だと思っていたら、彼は本当にこの答えを裏返しにします。これは、 "可能なこと"の下で "ジャスティンの推薦"の下に必ずしも載せないでください。 :-)

Monoを使用してJavaコードを処理するには、IKVM.NETを使用することをお勧めします。 IKVM.NETでは、.NET or the Mono CLRの上にJavaコードを実行できます。このようにJVMをスキップしていると言われる人もいますが、IKVM.NETは実際にはCLR上で動作するJVMの実装であると言うのがより正確です。

いずれにせよ、これを行うと、Ahead-of-time (AOT) Monoでコードをコンパイルするオプションがあります。つまり、実行時にCLRまたはJVMのいずれも必要ないことを意味する、マシン・ネイティブにコードをコンパイルすることができます。

上記のJesperとは異なり、AOTコンパイルを使用すると実際にはパフォーマンスが向上します。 JVM(およびCLR)が実行時にコンパイル時には不可能ないくつかの最適化を実行するのは真実ですが、その逆も真です。また、オプションの1つはコード生成にLLVMを使用して、通常はパフォーマンスが向上することです。ここで

は、一言で言えばパイプラインである:

あなたのコード - > IKVM.NET - >モノラル - > LLVM - >ネイティブ実行可能

それとも、単に生成AOTに設計されたJavaコンパイラを使用します(GCJまたはExcelsior Jetなど)。

Mono/IKVM.NETオプションが便利な場所は、iPhoneライブラリの一部としてJavaライブラリを使用する場合です(MonoTouchを使用)。 App Storeはネイティブバイナリのみを許可します。

編集:LLVM VMKitを使用して、Javaコードをマシンコードにコンパイルすることもできます。これは概念的にはMonoで説明したのと同じプロセスですが、その厄介なCILの問題を画像から守っています。

1

Oracle Solaris Studio Performance Analyzerをご覧ください。私はCharlie Huntが会議でそれをデモするのを見ましたが、それは単に息を呑むだけでした。 Javaアプリケーションのランタイム・デバッグとディスアセンブル、つまりホットスポットが実際に強調表示されたマシン命令を表示できます。 http://charliehunt.ulitzer.com/node/2067673

その他のドキュメント:Oracle Solaris Studio 12.2: Performance Analyzer

1

いや、私もJITネイティブ出力を得ることは難しいだろう考えていたが、この男の論文は、ネイティブコードを示し続けたが、彼が得た方法言っていない、この本の抜粋にも参照してください。出力。 JITコンパイラの出力が随時変更されるか、後で再生成されるコードキャッシュからパージされるだけで一致するかどうかはわかりますが、一部のコードブロックの一部のアセンブリのスナップショットを取得するにはどうすればよいでしょうか。 :|

http://www.google.com/url?sa=t&rct=j&q=Java+annotation+for+optimization&source=web&cd=15&ved=0CKEBEBYwDg&url=http%3A%2F%2Floome.cs.uiuc.edu%2Fpubs%2Fjones-kamin.pdf&ei=8vj-UN63C-bQ2QX-9IDoDQ&usg=AFQjCNEegMNXLwKyUTTJ5ljgnP7X9rPXHg&bvm=bv.41248874,d.b2I

関連する問題