sobre just cuestionario java caching jvm compilation jit

java - cuestionario sobre just in time



¿Por qué el caché JVM no compila el código JIT? (5)

No conozco los motivos reales, no estoy involucrado de ninguna manera en la implementación de JVM, pero puedo pensar en algunos posibles:

  • La idea de Java es ser un lenguaje de escribir una vez en cualquier lugar, y poner material precompilado en el archivo de la clase está violando eso (solo "tipo de" porque, por supuesto, el código de bytes real todavía estaría allí)
  • Aumentaría el tamaño de los archivos de clase porque tendría el mismo código varias veces, especialmente si ejecuta el mismo programa en varias JVM diferentes (lo cual no es poco común si considera que las diferentes versiones son JVM diferentes, que realmente tengo que hacer)
  • Los propios archivos de clase podrían no ser editables (aunque sería bastante fácil verificarlo)
  • Las optimizaciones de JVM se basan parcialmente en la información del tiempo de ejecución y en otras ejecuciones podrían no ser aplicables (aunque todavía deberían proporcionar algún beneficio)

Pero realmente estoy adivinando, y como pueden ver, realmente no creo que ninguno de mis motivos sean verdaderos paralizadores. Me imagino que Sun simplemente no considera este soporte como una prioridad, y tal vez mi primera razón es cercana a la verdad, ya que hacerlo habitualmente también podría llevar a la gente a pensar que los archivos de clase Java realmente necesitan una versión separada para cada VM en lugar de ser multiplataforma.

Mi forma preferida sería tener un traductor de bytecode a nativo separado que podría usar para hacer algo como esto explícitamente de antemano, creando archivos de clase explícitamente creados para una VM específica, posiblemente con el bytecode original en ellos para que pueda puede funcionar con diferentes máquinas virtuales también. Pero eso probablemente proviene de mi experiencia: he estado principalmente haciendo Java ME, donde realmente duele que el compilador de Java no sea más inteligente acerca de la compilación.

La implementación canónica de JVM de Sun aplica una optimización bastante sofisticada a bytecode para obtener velocidades de ejecución casi nativas después de ejecutar el código varias veces.

La pregunta es, ¿por qué este código compilado no se almacena en la caché del disco para su uso posterior en la misma función / clase?

Tal como están las cosas, cada vez que se ejecuta un programa, el compilador JIT comienza de nuevo, en lugar de utilizar una versión precompilada del código. ¿No agregaría esta característica agregar un aumento significativo al tiempo de ejecución inicial del programa, cuando el bytecode se está interpretando esencialmente?


Sin recurrir a una copia corta del enlace que @MYYN publicó, sospecho que esto se debe a que las optimizaciones que realiza la JVM no son estáticas sino más bien 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, haciendo que las optimizaciones en caché sean menos que óptimas.

Por lo tanto, necesitaría un mecanismo para establecer si las optimizaciones guardadas seguían siendo óptimas, en cuyo caso podría volver a optimizarse sobre la marcha.


Una actualización de las respuestas existentes: Java 8 tiene un JEP dedicado a resolver esto:

=> JEP 145: código compilado de caché . Nuevo enlace

En un nivel muy alto, su objetivo declarado es :

Guarde y reutilice código nativo compilado de ejecuciones anteriores para mejorar el tiempo de inicio de aplicaciones Java grandes.

Espero que esto ayude.


De hecho, la JVM de Oracle está documentada para hacerlo, citando a Oracle,

el compilador puede aprovechar el modelo de resolución de clase de Oracle JVM para persistir opcionalmente los métodos compilados de Java a través de llamadas, sesiones o instancias de la base de datos. Tal persistencia evita la sobrecarga de recompilaciones innecesarias a través de sesiones o instancias, cuando se sabe que semánticamente el código de Java no ha cambiado.

No sé por qué todas las implementaciones de VM sofisticadas no ofrecen opciones similares.


Excelsior JET tiene un compilador JIT en caché desde la versión 2.0, lanzado en 2001. Además, su compilador AOT puede recompilar el caché en una sola DLL / objeto compartido usando todas las optimizaciones.