Estoy tratando de ver el resultado de la compilación JIT estándar en lugar de usar OSR C1 en Java HotSpot VM. He apagado usando OSR -XX:-UseOnStackReplacement
y restringida a la compilación C1 usando -XX:TieredStopAtLevel=1
. Pero ahora mi método no está siendo compilada en absoluto. Tengo la impresión de compilación activada, el cual compilación de registros bien si lo dejo usar OSR. Así mismo, ninguno de mis puntos de ruptura están recibiendo golpe en archivos C1 sin OSR.
Estoy utilizando un simple fragmento de código para probar esta
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;
}
}
El problema es que se invoca workload
sólo una vez y ejecutar ese momento bucle muchos; que está no ejecutando workload
muchas veces; y que es el principal problema que tenemos aquí. JIT
puede optimizar los métodos, pero aquí se tiene un solo bucle - por lo menos OSR
está activo no hay mucho de optimizar.
Esto es bastante fácil de probar, puede ejecutar su método con:
-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
En el resultado que obtendrá, verá una gran cantidad de Installing method
.
Pero si se habilita la espalda 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
obtendrá una gran cantidad de Installing method
, sino también una línea:
Installing osr method (1) com.so.jit.OSRCompilation.workload()I @ 5