Стандартная JIT-компиляция вместо замены в стеке в HotSpot - PullRequest
2 голосов
/ 15 мая 2019

Я пытаюсь увидеть результат стандартной JIT-компиляции вместо OSR с использованием C1 в java HotSpot VM. Я отключил OSR, используя -XX:-UseOnStackReplacement, и ограничил компиляцию до C1, используя -XX:TieredStopAtLevel=1. Но сейчас мой метод вообще не компилируется У меня включена функция «Компиляция печати», которая прекрасно регистрирует компиляцию, если я разрешу использовать OSR. Также ни одна из моих точек останова не попадает в файлы C1 без OSR.

Я использую очень простой фрагмент кода для проверки

class Demo {
  public static void main(String[] args) {
      int a = workload();
    System.out.println("Calculated answer is: " + a);
  }

  private static int workload() {
    int a = 14;
    for (int i = 0; i<100000; i++) {
      a = a + i;
    }
    return a;
  }
}

1 Ответ

3 голосов
/ 16 мая 2019

Проблема в том, что вы вызываете workload только один раз и выполняете этот цикл много раз;вы не выполняете workload много раз;и это главная проблема у вас здесь.JIT может оптимизировать методы, но здесь у вас есть один цикл - поэтому, если OSR не активен, оптимизировать особо нечего.

Это довольно легко доказать, вы можете запустить свой метод с помощью:

-XX:+UnlockDiagnosticVMOptions  
-XX:TieredStopAtLevel=1 
-XX:+TraceNMethodInstalls // this is to track the compiled methods
-XX:-UseOnStackReplacement  
   com.so.jit.OSRCompilation // this is the classname I've used

В выводе, который вы получите, вы увидите много Installing method.

Но если вы включите обратно OSR:

-XX:+UnlockDiagnosticVMOptions  
-XX:TieredStopAtLevel=1 
-XX:+TraceNMethodInstalls // this is to track the compiled methods
-XX:+UseOnStackReplacement  
   com.so.jit.OSRCompilation // this is the classname I've used

, вы получите много Installing method, , а также одну строку:

 Installing osr method (1) com.so.jit.OSRCompilation.workload()I @ 5
...