domingo, 23 de noviembre de 2008

Compatibilidad entre versiones de Hotspot y versiones del JDK

Este es mi descubrimiento más curioso de todos en los últimos meses. Lo que en realidad me resulta curioso es no haberlo sabido/intuido hasta ahora. Es bueno estar siempre aprendiendo cosas nuevas, y es bueno también bajarse los humos uno mismo de vez en cuando...

Tradicionalmente muchos suelen confundir JDK y JVM. Pero son dos cosas distintas, una cosa es la versión de las bibliotecas Java, versión de bytecode y compilación javac (JDK) y otra muy distinta es la máquina virtual que ejecuta las aplicaciones Java. Esto lo he tenido claro siempre, lo que no sabía es que Hotspot tiene compatibilidad hacia atrás con versiones anteriores del JDK...

Con JRockit, esta diferenciación siempre ha estado muy clara, tanto por los usuarios como sobre todo por el equipo de JRockit/Bea/Oracle/quien_les_compre_a_continuación. Ellos distribuyen una versión de su VM "empaquetada" junto con una versión del JDK. De hecho, la versión JRockit 27.5 es compatible con JDK 1.4, JDK 1.5 y Java 6. Misma VM, diferente JDK en el paquete.

Pero estas semanas he estado haciendo pruebas y hablando con los ingenieros de Sun, resulta que Hotspot también es independiente del JDK y compatible hacia atrás con todos ellos (desde JDK 1.7 hasta JDK 1.5). En concreto he conseguido hacer funcionar con éxito y sin problemas aplicaciones sobre JDK 1.5 con Hotspot 14-b05 (distibuido en JDK 7 early access), y también el 6u6p con el mismo Hotspot 14 en lugar de el 13, que es el que venía por defecto...

¿Cómo se hace? Sencillo. Basta con identificar la bilioteca jvm de nuestro JRE y reemplazarla por la deseada. Algunos ejemplos:

  • En Windows, es el fichero jvm.dll que se encuentra tanto en <jre>\bin\server como en <jre>\bin\client (ojo, por supuesto que en realidad son distintas versiones, Hotspot cliente y Hotspot servidor)
  • En Linux x64, es el fichero libjvm.so que se encuentra en <jre>/lib/amd64/server

Del mismo modo, si no recuerdo mal, podemos poner la biblioteca jvm de JRockit en un directorio de instalación del JRE de Sun y viceversa. Es decir, la VM (Hotspot, JRockit, etc) es simplemente el libjvm.so si no me equivoco!

Lo que desde ya te puedo asegurar es que modificar la combinación JDK-JVM no está soportada por Sun. Así que, como suele decirse en estos casos... "Do it at your own risk!". Esto es lo que me dicen desde el equipo de Hotspot extraoficialmente cuando he preguntado por ello:

"Yes, for practical purposes, the latest HotSpot VMs should be compatible with JDKs back to 1.5, and we in engineering try hard to make that possible.

Sun, as a company, doesn't guarantee complete backward compatibility because of the huge testing matrix that would re required to verify each HotSpot release with every prior JDK. (We support more many more platforms than JRockit.)

So a customer can try out an new VM with an old JDK, but don't run your enterprise on it, and don't ask Sun to support it. ;-)"

:-)

No hay comentarios: