меня следовать тестовый класс для проверки логики 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)
На самом деле, скорее всего (если 'LOG.isDebug()' известно во время компиляции) есть Javac действует, а не JIT-компилятор. –
javac не может предсказать значение «LOG.isDebug()». – anstarovoyt
как вы видите System.out.println (IS_DEBUG) показывает «true» после setFinalStatic() – anstarovoyt