Java JIT コンパイルの使用について疑問に思っていました。私の理解では、「デッドコード」をコンパイルしようとする必要があります。私が疑問に思っているのは、何がデッド コードに分類されるかということです。
たとえば、debug というランタイム プロパティを false に設定したとします。私のプログラムにそのプロパティを取得し、それに基づいてメソッドを実行するコードがある場合、何がデッド コードとして分類されるのか疑問に思います。
public static final boolean DEBUG
static {
DEBUG = System.getProperties().containsKey("debug.enabled");
}
public static void logDebug(String msg) {
if (DEBUG) {
System.out.println("My Debug Message");
}
}
public static void main(String args) {
// 1) Check if DEBUG is true and log if
// it is.
//
if (DEBUG) {
System.out.println("My Debug Message");
}
// 2) Call a method to perform logging, let it check
// DEBUG
//
logDebug("My Second Debug Message");
}
main では、最初の if ブロックが DEBUG をチェックします。それは間違いなので、JIT はこのブロックが決して実行されないことを認識し、デッド コードとしてコンパイルするだろうと思います。
同じことがlogDebugメソッドにも起こるかどうか疑問に思っていました-JVMは引き続きそのメソッドに毎回入りますか、それともそのメソッドで何も起こらないことを理解して最適化しますか?
おそらく、JIT がどのように機能するかについての私の理解は完全に間違っているのでしょうか?