La máquina virtual Java, o JVM para abreviar, es el componente central del JRE, es decir, el entorno de ejecución de Java. Permite la ejecución independiente de la plataforma de programas en código de bytes Java.
En lenguajes de programación de alto nivel como C y C ++, los compiladores suelen generar un archivo de programa directamente ejecutable. Estos «ejecutables nativos» consisten en los comandos del lenguaje de máquina de una arquitectura de hardware específica.
Esto tiene la ventaja de una ejecución ligeramente más rápida y menos dependencia de entornos de ejecución complejos. Sin embargo, el programa debe recompilarse para cada plataforma de hardware y sistema operativo compatibles, así como para los cambios en el código fuente.
Lenguajes como Java, C # o Python toman una ruta diferente. Bajo el lema «Escribir una vez, ejecutar en todas partes», Java quiere lograr la máxima portabilidad. El compilador de Java «javac» traduce el texto fuente en un código intermedio que aún no es ejecutable. Se requiere una JVM para la ejecución final.
¿Cómo funciona la JVM?
La JVM es una máquina virtual basada en procesos, una máquina virtual muy simple que ejecuta el código de bytes de Java. Estas máquinas virtuales traducen las instrucciones de código de bytes en tiempo de ejecución al código de máquina del hardware real y a las llamadas al sistema del sistema operativo. Esto tiene la ventaja de una alta portabilidad.
Un mismo programa puede ejecutarse sin recompilación en todos los sistemas para los que existe una VM correspondiente. A diferencia de las máquinas virtuales basadas en sistemas como VirtualBox, VMware o Hyper-V, solo permiten deliberadamente la ejecución de una sola aplicación en lugar de un sistema operativo completo.
Además de la independencia de la plataforma, la JVM tiene otras ventajas en términos de velocidad y seguridad. La traducción en tiempo de ejecución puede realizar optimizaciones dinámicas que no son posibles con los compiladores anticipados convencionales. Por ejemplo, el compilador just-in-time puede eliminar por completo rutas de código y bucles que no son necesarios con los datos de entrada existentes. Esto aumenta la velocidad de las funciones en el curso posterior de la ejecución.
La seguridad es uno de los criterios de diseño fundamentales de Java VM. La máquina virtual aísla en gran medida los programas Java del sistema operativo. El acceso a los recursos del sistema subyacente se puede controlar con precisión. La JVM contiene una gestión automática de la memoria a través del recolector de basura. Los errores de programación típicos, como desbordamientos de búfer y bloqueos debido a una memoria liberada prematuramente, no son posibles en la VM.
Una máquina virtual, muchos lenguajes
La máquina virtual Java ejecuta un código intermedio que tiene poco que ver con el lenguaje de programación real. Es por eso que la JVM no solo se puede utilizar en la programación Java. En principio, cualquier lenguaje se puede traducir a un código de bytes compatible con JVM. Todo lo que necesita es un compilador correspondiente.
El uso de otros lenguajes no solo ofrece la ventaja de la independencia de la plataforma, sino también una mejor integración de diferentes sistemas de software. Por ejemplo, la variante de Python Jython se ejecuta en la JVM. Por lo tanto, puedes utilizar clases de Java y permite una integración perfecta de código Python y Java. Otros lenguajes para la JVM incluyen el dialecto LISP Clojure, los lenguajes funcionales Erjang y Scala, así como Kotlin, Groovy y Jruby.
Implementaciones de Java VM
Además de la JVM de hotspot oficial de Oracle, hay varias otras implementaciones de Java VM. Se diferencian principalmente en sus detalles de implementación, áreas de aplicación y funciones adicionales. Lo que todos tienen en común es la capacidad de ejecutar código de bytes de Java de acuerdo con el estándar «Especificación de máquina virtual de Java». Las JVM más importantes incluyen:
- HotSpot: La implementación de referencia de Oracle y es parte de la plataforma Oracle Java, incluida la versión de código abierto OpenJDK.
- GraalVM: una nueva JVM de Oracle. No solo comprende el código de bytes de Java, sino también el código de bytes del sistema de compilación LLVM. Por lo tanto, también puede ejecutar programas escritos en lenguajes compatibles con LLVM como C / C ++, Julia, Rust y muchos otros.
- OpenJ9: Eclipse JVM está diseñado para rendimiento y escalabilidad. Desarrollado originalmente por IBM, la Fundación Eclipse ahora es responsable del proyecto.
- JamVM: implementa una JVM muy pequeña que se utiliza en algunos sistemas ARM, por ejemplo.
- DalvikVM: El DalvikVM utilizado en dispositivos Android más antiguos a menudo se considera una JVM. Estrictamente hablando, no es porque use un código de bytes diferente.