public class Inline {
public static void main(String[] args) throws Exception {
long upto = Long.parseLong(args[0]);
for(int i = 0; i < upto; i++) {
int x = inline1();
Thread.sleep(1);
}
}
public static int inline1() {
return inline2();
}
public static int inline2() {
return inline3();
}
public static int inline3() {
return 4;
}
}
Это простой пример, который я использую, чтобы увидеть влияние безопасных точек и затухания счетчика на методы, компилируемые в сборку.
Насколько я понимаю, при вызове Thread.sleep
(или System.gc
) счетчик вызова метода / обратного фронта будет уменьшен и никогда не превысит CompileThreshold
.
Thread.sleep()
должен вставить безопасную точку, и методы не должны быть скомпилированы. Однако когда я запускаю приведенный выше пример с -XX:+PrintCompilation
, я вижу все компилируемые методы.
Я выполняю код следующим образом:
java -XX:+PrintCompilation Inline 10000
Моя версия Java:
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
Я что-то упустил?