La implementación canónica de JVM de Sun aplica una optimización bastante sofisticada al código de bytes para obtener velocidades de ejecución casi nativas después de que el código se haya ejecutado varias veces.
La pregunta es, ¿por qué este código compilado no se almacena en caché en el disco para su uso durante los usos posteriores de la misma función / clase?
Tal como está, cada vez que se ejecuta un programa, el compilador JIT se activa de nuevo, en lugar de utilizar una versión precompilada del código. ¿No agregaría esta característica un impulso significativo al tiempo de ejecución inicial del programa, cuando el código de bytes se está interpretando esencialmente?
Respuestas:
Sin recurrir a cortar y pegar el enlace que publicó @MYYN, sospecho que esto se debe a que las optimizaciones que realiza la JVM no son estáticas, sino dinámicas, basadas en los patrones de datos y en los patrones de código. Es probable que estos patrones de datos cambien durante la vida útil de la aplicación, lo que hace que las optimizaciones en caché sean menos que óptimas.
Por lo tanto, necesitaría un mecanismo para establecer si las optimizaciones guardadas siguen siendo óptimas, momento en el que también podría volver a optimizar sobre la marcha.
fuente
De hecho, la JVM de Oracle está documentada para hacerlo, citando a Oracle,
No sé por qué todas las implementaciones sofisticadas de VM no ofrecen opciones similares.
fuente
Una actualización de las respuestas existentes: Java 8 tiene un JEP dedicado a resolver esto:
=>
JEP 145: Código compilado en caché. Enlace nuevo .A un nivel muy alto, su objetivo declarado es :
Espero que esto ayude.
fuente
Excelsior JET tiene un compilador JIT de almacenamiento en caché desde la versión 2.0, lanzado en 2001. Además, su compilador AOT puede volver a compilar el caché en un solo objeto DLL / compartido utilizando todas las optimizaciones.
fuente
No conozco las razones reales, no estoy involucrado de ninguna manera en la implementación de JVM, pero puedo pensar en algunas plausibles:
Pero realmente estoy adivinando, y como puede ver, realmente no creo que ninguna de mis razones sea un obstáculo real. Supongo que Sun simplemente no considera este soporte como una prioridad, y tal vez mi primera razón sea cercana a la verdad, ya que hacer esto habitualmente también podría llevar a la gente a pensar que los archivos de clases de Java realmente necesitan una versión separada para cada VM en lugar de ser multiplataforma.
Mi forma preferida sería tener un traductor de código de bytes a nativo separado que podría usar para hacer algo como esto explícitamente de antemano, creando archivos de clase que se compilan explícitamente para una máquina virtual específica, con posiblemente el código de bytes original en ellos para que también se puede ejecutar con diferentes VM. Pero eso probablemente proviene de mi experiencia: he estado haciendo principalmente Java ME, donde realmente duele que el compilador de Java no sea más inteligente en la compilación.
fuente