java - ¿Puedo obligar a la JVM a compilar de forma nativa un método determinado?
performance jit (2)
Tengo un método de rendimiento crítico llamado a menudo cuando mi aplicación se inicia. Finalmente, se compila con JIT, pero no después de un tiempo notable ejecutándose en el intérprete.
¿Hay alguna manera de que pueda decirle a la JVM que quiero que compile este método desde el principio (sin ajustar otras -XX:CompileThreshold
internas con cosas como -XX:CompileThreshold
)?
La única forma que conozco es el indicador -Xcomp
, pero generalmente no es recomendable utilizarlo. Obliga a la compilación JIT inmediata de TODAS las clases y métodos la primera vez que se ejecutan. La desventaja es que verá una disminución en el rendimiento en el inicio inicial (debido a una mayor actividad JIT). La otra limitación importante con este indicador es que parece deshabilitar la optimización basada en perfiles incrementales que normalmente haría JIT. En el modo mixto estándar, el compilador JIT puede (y lo hará) desoptimizar y volver a compilar partes del código continuamente en función del perfil y la información de tiempo de ejecución recopilada. Esto le permite "corregir" las optimizaciones defectuosas, como las comprobaciones de límites que se omitieron pero que resultaron necesarias, los inlinings -Xcomp
etc. -Xcomp
desactiva la optimización basada en perfiles y, dependiendo del programa, puede causar pérdidas significativas de rendimiento en general solo por un pequeña o ninguna ganancia real en el inicio, por lo que no se recomienda su uso.
Además de -Xcomp
(que es bastante brutal) y -XX:CompileThreshold
(que controla la cantidad de ejecuciones de un método dado, el JIT se ejecutará en modo interpretado para recopilar estadísticas antes de compilarlo / optimizarlo), también hay -Xbatch
. Esto obliga a la compilación de JIT al "primer plano", esencialmente bloqueando las llamadas a los métodos hasta que se compila, en lugar de compilarlo en segundo plano como lo hace normalmente.
No especificó qué versión de Java está utilizando, pero si Java 7 es una opción para usted, introduce un nuevo modelo JIT llamado "Compilación por niveles" (activado con el -XX:+TieredCompilation
). Lo que hace la compilación por niveles es que permite un pase de compilación inicial, más pequeño en el primer uso de un método y luego una compilación / optimización adicional, más grande, basada en los datos recopilados de perfiles. Parece que debería ser interesante para ti.
Supuestamente requiere algunos ajustes adicionales y parámetros / configuraciones, pero no he podido comprobarlo más.
No estoy seguro de si precompilará completamente el código, pero podría agregar su clase con el método crítico al volcado de datos compartido de la JVM. Vea esta pregunta para más detalles.
También, ¿has considerado JNI? Si su método requiere mucha CPU, podría acelerar las cosas considerablemente.