Javaの性能
クラスの実行に先立ち、オラクルのJVMはバイトコードの検証を行う。バイトコードのロードと検証は特定のクラスがロードされ実行する準備ができた場合のみ行われ、プログラムの開始時点で行われるわけではない。しかし、Javaのクラスライブラリも正規のJavaクラスであり、使用時にロードされるため、Javaプログラムの起動時間は例えばC++のプログラムより長くなることが多い。
分割検証と呼ばれる技術がJavaプラットフォームのJ2MEで導入され、Java version 6からJava仮想マシンで利用されるようになった。これはバイトコードの検証を二つのフェーズに分割する。
設計時 - ソースコードからバイトコードにクラスをコンパイルする際
実行時 - クラスをロードする際
こうした手法は、Javaコンパイラがクラスのコードの流れを解析し、コンパイルされたメソッドのバイトコードにクラスのフロー情報の概要を注釈(アノテート)することで動作する。実行時の検証を劇的に単純化するわけではないが、若干の処理を省略することができる。
適応的最適化 (adaptive optimization) とは、計算機科学においてプログラムの一部を現在の実行結果のプロファイルに基づき動的再コンパイル (dynamic recompilation) する技術である。単純な実装では、適応的最適化はジャストインコンパイルとインタプリタ実行を選択するだけだが、より高水準のものでは、データの局所的な状態を用いて分岐を取り除き、インライン展開してコンテキスト切り替えを削減することもできる。
HotSpotのようなJava仮想マシンは、一度JITコンパイルされたコードを解消 (deoptimization: 脱最適化) することも可能である。これによって、積極的な(場合によっては危険な)最適化を実行し、後で最適化を解消し安全な実行方法に戻ることもできる。