Jit

jit.png

Jitとは

Just-In-Timeコンパイラのことである
Dalvikバイトコードをネイティブコードにコンパイルする働きをする。
Android2.2(Froyo)以降のバージョンにこのコンパイラが含まれている。
これがああると、開発者はアプリケーションのバイトコードを調べる必要がなくなる

JITがパフォーマンスを向上させる理由

  • ネイティブコードは仮想マシンによって解釈されるのではなく、CPUによって直接実行される
  • ネイティブコードを特定のアーキテクチャに合わせて最適化出来る

Googleが行ったベンチマークではAndroid2.2の実行速度はAndroid2.1の2~5倍という結果が出ている。
ベンチマークの結果はコードの内容によって大きく異る可能性があるのでなんとも言えないが、
Android2.2以降のバージョンでパフォーマンスの大幅な向上が期待できることは確かである。

JITコンパイラの無効化・有効化

JITコンパイラは
アプリケーションのマニフェストでandroid:vmSafeMode属性で有効化・無効化できる。
JITコンパイラが搭載されている場合は、デフォルトで有効となる。
android::vmSafeModeはAndroid2.2で追加された属性である。
JITコンパイラを無効にすると、アプリの実行速度が遅くなったりします。

ネイティブコードがある場合のJITの動き

JITは普通、バイトコードをネイティブコードにコンパイルする。
ネイティブコードが生成されている場合は常にそれを使う。
それにより、コードを解釈する頻度を(理想的には一回に)減らすことで、アプリケーションのパフォーマンスを向上させる。

トレースを有効にするとJITコンパイラが無効になる

なので、トレースの結果は少し誤解を招くおそれがある。
つまり、
メソッドの実行にこれこれの時間がかかると考えていたとしても、
実際にはDalvik JITコンパイラによってネイティブコードにコンパイルできるため、
それよりもずっと短い時間で済むこともある。
ネイティブ関数で費やされた時間はトレースに表示されない。

JITに関するLogCatメッセージ

Jit: resizing JitTable from 4096 to 8192

このメッセージの意味は、
メモリを使っているよということ。
もし、このメッセージの後、アプリが落ちるなら
このメッセージは単にJust-In-Timeコンパイラに関する情報を出してるだけ。
このメッセージが出てるってことは、メモリを使いすぎてる前兆である。

参考にした書籍


この本は、この手の技術書には珍しく、日本語訳がすばらしくわかりやすいです!


android-debug

サポートサイト Wikidot.com android-debug