マーティンJH:
私は、以下のクラスを持っていることをみましょうと言います:
public class MyClass {
public void doSomething() {
System.out.println("doing something.");
}
}
のがさらに仮定しましょう、私のすべてのプロジェクトがないことをその呼び出すことである.something()
方法を。いいえオーバーライドしたり、他の面白いビジネスが起こっています。
MyClass myObj = new MyClass();
myObj.doSomething();
いjavac
、このメソッド呼び出しをオーバーライドし、「早期バインディング」への結合を最適化されていないことをコンパイラ通知は?私は好奇心から求めています。私はコースのふりかけのだろう任意の実世界のアプリケーションではfinal
、static
、およびprivate
すべての私のコードの上に。
スティーブンC:
バイトコードコンパイラは、(のようなjavac
)通常のインスタンスメソッド呼び出しのために結合早く行いません。
クラスはそのメソッドののいずれかを呼び出しているとき、最適化のこの種しか適用することができること、クラス手段の分割コンパイルのJavaモデル。(もし
javac
仮に早期に変更し、間違っている結合につながる可能性がある1つのクラスを再コンパイルし、クラス全体に結合でした。)ほとんどの最適化を行う場合JITコンパイラ(またはAOTコンパイラー・ジェネレータ)があるので、大きな価値は、ありません。
現代のJVMでのJITコンパイラは、大規模な最適化(これまでに)ロードされたクラスの完全なセットに基づいありません。これは、メソッドのディスパッチを離れて最適化し、メソッド呼び出しをインライン化が含まれます。さらに、JITコンパイラは、新しいクラスのダイナミック・ロードのようなものが前の最適化を無効にするスマートキーの最適化を追跡するのに十分な、と再コンパイルがあります。