2013-04-06 3 views
2

меня следовать тестовый класс для проверки логики JIT-компилятор:Java JIT-компилятор: мертвый код удален навсегда?

public static final int COUNT = 2_000_000_000; 

public static final MyLogger LOG = new MyLogger(false); 

//Here IS_DEBUG is false 
public static final boolean IS_DEBUG = LOG.isDebug(); 

private void run() throws Exception 
{ 
    System.out.println(getSum(COUNT)); 

    //Compilation without OSR 
    System.out.println(getSum(COUNT + 2)); 

    //Change value IS_DEBUG -> true over reflection 
    setFinalStatic(TestDeadCode.class.getField("IS_DEBUG"), true); 
    //Show true 
    System.out.println(IS_DEBUG); 

    COUNT = COUNT/2; 
    System.out.println(getSum(COUNT + 3)); 
} 

private int getSum(int count) 
{ 
    int result = 0; 
    for (int j = 0; j < count; j++) 
    { 
     result = result + 1; 
     if (IS_DEBUG) 
     { 
      //Dead code here 
      System.out.println("debug: " + result); 
     } 
    } 
    return result; 
} 

Если я вызываю метод run() затем "мертвый код"

System.out.println("debug: " + result);

не выполняется ни разу. Это ошибка JVM?

Java Версия:

Java (TM) SE Runtime Environment (сборка 1.7.0_17-b02)

Java HotSpot (TM) 64-разрядного сервера VM (строительство 23,7-b01, смешанный режим)

ОБНОВЛЕНИЕ: выход PrintCompilation:

79 1 %   com.nau.sample.deadcode.TestDeadCode::getSum @ 7 (34 bytes) 

85 1    com.nau.sample.deadcode.TestDeadCode::getSum (34 bytes) 
+0

На самом деле, скорее всего (если 'LOG.isDebug()' известно во время компиляции) есть Javac действует, а не JIT-компилятор. –

+1

javac не может предсказать значение «LOG.isDebug()». – anstarovoyt

+0

как вы видите System.out.println (IS_DEBUG) показывает «true» после setFinalStatic() – anstarovoyt

ответ

Смежные вопросы