¿Qué es la JVM? Presentación de la máquina virtual Java

La Máquina Virtual Java es un programa cuyo propósito es ejecutar otros programas. Es una idea simple que también se erige como uno de nuestros mejores ejemplos de codificación de kung fu . La JVM cambió el status quo de su época y continúa apoyando la innovación de programación en la actualidad.

Para qué se utiliza la JVM

La JVM tiene dos funciones principales: permitir que los programas Java se ejecuten en cualquier dispositivo o sistema operativo (conocido como el principio "Escribir una vez, ejecutar en cualquier lugar") y administrar y optimizar la memoria del programa. Cuando se lanzó Java en 1995, todos los programas de computadora se escribieron en un sistema operativo específico y el desarrollador de software administraba la memoria del programa. Así que la JVM fue una revelación.

JavaWorld /

Tener una definición técnica para la JVM es útil, y también existe una forma cotidiana en que los desarrolladores de software piensan en ello. Analicemos esos:

  • Definición técnica : la JVM es la especificación de un programa de software que ejecuta código y proporciona el entorno de ejecución para ese código.
  • Definición cotidiana : La JVM es la forma en que ejecutamos nuestros programas Java. Configuramos la JVM y luego confiamos en ella para administrar los recursos del programa durante la ejecución.

Cuando los desarrolladores hablan de JVM, generalmente nos referimos al proceso que se ejecuta en una máquina, especialmente un servidor, que representa y controla el uso de recursos para una aplicación Java. Compare esto con la especificación JVM , que describe los requisitos para crear un programa que realice estas tareas.

¿Quién desarrolla y mantiene la JVM?

La JVM es ampliamente implementada, muy utilizada y mantenida por algunos programadores muy brillantes, tanto corporativos como de código abierto. El proyecto OpenJDK es el resultado de la decisión de Sun Microsystems de utilizar Java de código abierto. OpenJDK ha continuado a través de la administración de Java por parte de Oracle, con gran parte del trabajo pesado en estos días realizado por ingenieros de Oracle.

Gestión de memoria en la JVM

La interacción más común con una JVM en ejecución es verificar el uso de memoria en el montón y la pila. El ajuste más común es ajustar la configuración de memoria de la JVM.

Recolección de basura

Antes de Java, el programador gestionaba toda la memoria del programa. En Java, la JVM administra la memoria del programa. La JVM administra la memoria a través de un proceso llamado recolección de basura , que identifica y elimina continuamente la memoria no utilizada en los programas Java. La recolección de basura ocurre dentro de una JVM en ejecución.

En los primeros días, Java fue objeto de muchas críticas por no ser tan "cercano al metal" como C ++ y, por lo tanto, no tan rápido. El proceso de recolección de basura fue especialmente controvertido. Desde entonces, se han propuesto y utilizado una variedad de algoritmos y enfoques para la recolección de basura. Con un desarrollo y optimización consistentes, la recolección de basura ha mejorado enormemente.

¿Qué significa "cerca del metal"?

Cuando los programadores dicen que un lenguaje de programación o una plataforma están "cerca del metal", queremos decir que el desarrollador puede administrar mediante programación (escribiendo código) la memoria de un sistema operativo. En teoría, los programadores pueden sacar más rendimiento de nuestros programas si estipulan cuánto se usa y cuándo descartarlo. En la mayoría de los casos, delegar la administración de la memoria a un proceso altamente refinado como la JVM produce un mejor rendimiento y menos errores que hacerlo usted mismo.

La JVM en tres partes

Se podría decir que la JVM tiene tres aspectos: especificación, implementación e instancia. Consideremos cada uno de estos.

1. La especificación de JVM

Primero, la JVM es una especificación de software. De una manera algo circular, la especificación JVM destaca que los detalles de su implementación no están definidos dentro de la especificación, para permitir la máxima creatividad en su realización:

"Para implementar la máquina virtual Java correctamente, solo necesita poder leer el classformato de archivo y realizar correctamente las operaciones especificadas en el mismo".

JS Bach describió una vez la creación de música de manera similar:

"Todo lo que tienes que hacer es tocar la tecla correcta en el momento correcto".

Entonces, todo lo que JVM tiene que hacer es ejecutar los programas Java correctamente. Suena simple, incluso puede parecer simple desde el exterior, pero es una empresa enorme, especialmente dado el poder y la flexibilidad del lenguaje Java.

La JVM como máquina virtual

La JVM es una máquina virtual que ejecuta archivos de clase Java de forma portátil. Ser una máquina virtual significa que la JVM es una abstracción de una máquina real subyacente, como el servidor en el que se ejecuta su programa. Independientemente del sistema operativo o hardware que esté realmente presente, la JVM crea un entorno predecible para que se ejecuten los programas. Sin embargo, a diferencia de una verdadera máquina virtual, la JVM no crea un sistema operativo virtual. Sería más exacto describir la JVM como un entorno de tiempo de ejecución administrado o una máquina virtual de proceso .

2. Implementaciones de JVM

La implementación de la especificación JVM da como resultado un programa de software real, que es una implementación de JVM. De hecho, existen muchas implementaciones de JVM, tanto de código abierto como propietarias. HotSpot JVM de OpenJDK es la implementación de referencia y sigue siendo una de las bases de código más probadas y comprobadas del mundo. HotSpot es también la JVM más utilizada.

Casi todas las JVM con licencia se crean como bifurcaciones de OpenJDK y HotSpot JVM, incluido el JDK con licencia de Oracle. Los desarrolladores que crean una bifurcación con licencia de OpenJDK a menudo están motivados por el deseo de agregar mejoras de rendimiento específicas del sistema operativo. Normalmente, descarga e instala la JVM como una parte empaquetada de un entorno de ejecución de Java (JRE).

3. Una instancia de JVM

Una vez que la especificación JVM se haya implementado y lanzado como un producto de software, puede descargarla y ejecutarla como un programa. Ese programa descargado es una instancia (o versión instanciada) de la JVM.

La mayoría de las veces, cuando los desarrolladores hablan de "la JVM", nos referimos a una instancia de JVM que se ejecuta en un entorno de producción o desarrollo de software. Podría decir, "Hola Anand, ¿cuánta memoria está usando la JVM en ese servidor?" o "No puedo creer que haya creado una llamada circular y un error de desbordamiento de pila bloqueó mi JVM. ¡Qué error de novato!"

¿Qué es una especificación de software?

Una especificación de software (o especificación) es un documento de diseño legible por humanos que describe cómo debe funcionar un sistema de software. El propósito de una especificación es crear una descripción clara y requisitos para que los ingenieros los codifiquen.

Carga y ejecución de archivos de clase en la JVM

Hemos hablado sobre el papel de la JVM en la ejecución de aplicaciones Java, pero ¿cómo realiza su función? Para ejecutar aplicaciones Java, la JVM depende del cargador de clases de Java y de un motor de ejecución de Java.

El cargador de clases de Java en la JVM

Todo en Java es una clase y todas las aplicaciones Java se crean a partir de clases. Una aplicación puede constar de una clase o de miles. Para ejecutar una aplicación Java, una JVM debe cargar archivos .class compilados en un contexto, como un servidor, donde se pueda acceder a ellos. Una JVM depende de su cargador de clases para realizar esta función.

El cargador de clases de Java es la parte de la JVM que carga las clases en la memoria y las pone a disposición para su ejecución. Los cargadores de clases utilizan técnicas como la carga diferida y el almacenamiento en caché para hacer que la carga de clases sea lo más eficiente posible. Dicho esto, la carga de clases no es el acertijo épico que (digamos) es la gestión de memoria en tiempo de ejecución portátil, por lo que las técnicas son comparativamente simples.

Cada máquina virtual Java incluye un cargador de clases. La especificación de JVM describe métodos estándar para consultar y manipular el cargador de clases en tiempo de ejecución, pero las implementaciones de JVM son responsables de cumplir con estas capacidades. Desde la perspectiva del desarrollador, los mecanismos de carga de clases subyacentes suelen ser una caja negra.

El motor de ejecución en la JVM

Una vez que el cargador de clases ha hecho su trabajo de cargar clases, la JVM comienza a ejecutar el código en cada clase. El motor de ejecución es el componente JVM que maneja esta función. El motor de ejecución es esencial para la JVM en ejecución. De hecho, a todos los efectos prácticos, es la instancia de JVM.

La ejecución de código implica administrar el acceso a los recursos del sistema. El motor de ejecución de JVM se encuentra entre el programa en ejecución, con sus demandas de archivos, red y recursos de memoria, y el sistema operativo, que suministra esos recursos.

Cómo el motor de ejecución administra los recursos del sistema

Los recursos del sistema se pueden dividir en dos categorías amplias: memoria y todo lo demás.

Recuerde que la JVM es responsable de eliminar la memoria no utilizada y que la recolección de basura es el mecanismo que lo hace. La JVM también es responsable de asignar y mantener la estructura referencial que el desarrollador da por sentada. Como ejemplo, el motor de ejecución de la JVM es responsable de tomar algo como la newpalabra clave en Java y convertirla en una solicitud específica del sistema operativo para la asignación de memoria.

Más allá de la memoria, el motor de ejecución administra los recursos para el acceso al sistema de archivos y la E / S de la red. Dado que la JVM es interoperable entre sistemas operativos, esta no es una tarea fácil. Además de las necesidades de recursos de cada aplicación, el motor de ejecución debe responder a cada entorno de SO. Así es como la JVM puede manejar las demandas en estado salvaje.

Evolución de JVM: pasado, presente, futuro

En 1995, la JVM introdujo dos conceptos revolucionarios que desde entonces se han convertido en la tarifa estándar para el desarrollo de software moderno: "Escribir una vez, ejecutar en cualquier lugar" y gestión automática de memoria. La interoperabilidad del software era un concepto audaz en ese momento, pero pocos desarrolladores hoy lo pensarían dos veces. Del mismo modo, mientras que nuestros antepasados ​​de la ingeniería tuvieron que administrar la memoria del programa ellos mismos, mi generación creció con la recolección de basura.

Podríamos decir que James Gosling y Brendan Eich inventaron la programación moderna, pero miles más han refinado y construido sobre sus ideas durante las décadas siguientes. Mientras que la máquina virtual Java era originalmente solo para Java, hoy ha evolucionado para admitir muchos lenguajes de programación y scripts, incluidos Scala, Groovy y Kotlin. De cara al futuro, es difícil ver un futuro en el que la JVM no sea una parte importante del panorama del desarrollo.

Todo sobre la JVM

  • Desafiantes de Java: comportamiento de subprocesos en la JVM
  • Desafiantes de Java: sobrecarga de métodos en la JVM
  • Dentro de la optimización del rendimiento de JVM
  • Conceptos básicos de bytecode: cómo la JVM maneja el bytecode
  • Excepciones de Java: cómo la JVM maneja las excepciones
  • Presentamos la máquina virtual Java esbelta y media

Esta historia, "¿Qué es la JVM? Introducción a la máquina virtual Java" fue publicada originalmente por JavaWorld.