Introducción a la máquina virtual Java
En este artículo, aprenderemos sobre Java Virtual Machine, también conocida como "JVM". Java Virtual Machine es una máquina virtual que permite que un sistema informático ejecute / ejecute programas Java. Básicamente, JVM es un motor, que funciona como un entorno de tiempo de ejecución para el código Java. JVM convierte el código de Java en lenguaje de máquina. Cuando ejecuta un archivo compilado .class, va a JVM y luego JVM devuelve el resultado. Java Virtual Machine es parte de JRE, que significa "Java Runtime Environment". Las tareas básicas para una máquina virtual Java consisten en cargar el código, luego verificar el código y ejecutar el código. Además, proporcione el entorno de tiempo de ejecución para la ejecución del código. JVM consta de varios componentes como Classloader, Lista de espacio asignado por JVM como Stack, un motor de ejecución y algunas bibliotecas nativas.
La arquitectura de la máquina virtual Java 
Como se muestra en la imagen de arriba, Java Virtual Machine Architecture consta de varios componentes. Aprendamos sobre cada componente específico individualmente.
Cargador
Como su nombre lo indica, es un componente responsable de cargar archivos de clase. Cargar, vincular e inicializar un archivo de clase, son las principales funciones del cargador. El cargador funciona en tiempo de ejecución.
- Carga: Básicamente, el cargador lee el archivo .class, luego genera el código binario y lo guarda en un área de método. Bootstrap Classloader, Extension Classloader y Application Classloader son los diversos ClassLoaders responsables de cargar varias clases.
- Vinculación: tres funciones principales como Verificación, Preparación y Resolución. Comienza con la verificación de archivos .class. Si la verificación falla, da una excepción de verificación de tiempo de ejecución. Más tarde, la memoria se asigna a las variables con valores predeterminados. Luego, finalmente, las referencias simbólicas de la memoria se reemplazan con referencias directas del área de memoria.
- Inicializando: Esta es una parte final de ClassLoader. Los valores originales se asignan a todas las variables estáticas, seguidas de la ejecución del Bloque estático. Esta parte se ejecuta de arriba a abajo de una clase.
Montón
Los detalles de un objeto y las variables de instancia se almacenan aquí. Es un área de memoria compartida, lo que significa que los datos almacenados aquí no son seguros para subprocesos.
Excepción en el subproceso "main" java.lang.OutOfMemoryError: espacio de almacenamiento dinámico Java
Uno de los errores más identificables es la excepción "OutOfMemoryError ", lo que significa que la JVM no puede asignar un objeto en el área del montón o la asignación de memoria no se puede hacer para el mismo objeto.
Apilar
Aquí es donde se crea una pila de tiempo de ejecución separada para cada subproceso nuevo. También conocido como una pila de tiempo de ejecución, cada vez que se llama a un método, todos los detalles se almacenan en el soporte de tiempo de ejecución correspondiente y, una vez completado el método, estos detalles se eliminan de la pila.
Registros de PC
Para cada subproceso individual, se crea un registro de PC (Contador de programa) separado, que almacena la dirección de la instrucción de ejecución actual, que luego se actualizará con la siguiente instrucción. Esta área de memoria es bastante pequeña y tiene un tamaño fijo.
Pila de métodos nativos
Es uno de su propio tipo de área de memoria, que es invocada por un subproceso y luego el subproceso está en un nivel completamente nuevo donde la estructura y las restricciones de seguridad implicadas por Java Virtual Machine ya no están en ejercicio. En comparación con otras áreas de memoria de tiempo de ejecución, la memoria ocupada por las pilas de métodos nativos no tiene un tamaño fijo, sin limitaciones de incremento o disminución.
Interfaz nativa de Java
JNI simplemente interactúa con las Bibliotecas de métodos nativos mencionadas a continuación que son de implementación C, C ++ y proporcionan lo mismo al motor de ejecución. JNI permite el acceso directo al código de ensamblaje. Para una JVM, Java y Native son los dos tipos de códigos. El JNI establece sin problemas un vínculo bien definido entre estos dos.
Bibliotecas de métodos nativos
Colección de bibliotecas nativas, según lo requiera el motor de ejecución.
Motor de ejecución
Bueno, ahora tenemos el programa Java en bytecode, que se asigna a las áreas de datos explicadas anteriormente a través de un cargador de clases, y ahora el bytecode será ejecutado por el motor de ejecución. El motor de ejecución simplemente lee el código de bytes en unidades, como una máquina que lee líneas de código una por una. El bytecode es un formato legible por humanos, por lo que la máquina no puede leerlo, lo tiene y debe convertirse a un formato legible por máquina, donde los componentes a continuación se utilizan para fines de interpretación.
El motor de ejecución tiene tres componentes principales, que son el intérprete, el compilador JIT y un recolector de basura.
1. intérprete
Simplemente, ejecuta el bytecode en un método secuencial. Una llamada se realiza mediante una consulta de línea de comandos con un archivo compilado como argumento. El intérprete es bastante rápido al interpretar y ejecutar comandos uno por uno, lo que ocurre más rápido que el compilador JIT para compilar el código.
nombre de clase java
Una clase main () es obligatoria en un archivo compilado .class.
2. Compilador JIT
Uno de los componentes más importantes del Java Runtime Environment, que mejora el rendimiento de la aplicación Java en tiempo de ejecución. Ningún otro componente tiene más impacto en el rendimiento que el compilador JIT. Este es un compilador predeterminado y se activa cuando se llama a cualquier método Java.
3. Recolector de basura
Como su nombre indica, tiene algo que ver con la basura, Garbage Collector simplemente busca todos los objetos posibles disponibles en el espacio de almacenamiento dinámico JVM, comprueba si está en uso y luego elimina los no utilizados. Entonces, simplemente marca las piezas de memoria que están en uso o no. Luego continúa barriendo, donde simplemente elimina el objeto marcado. El mejor caso de uso es que no se necesita un sistema de asignación de memoria manual, ya que Garbage Collector hace el trabajo de eliminar el espacio de memoria no utilizado, automáticamente. Pero, como se trata de una tarea automática, ningún programador tiene control sobre la programación de ningún intervalo de tiempo para tareas de limpieza específicas y requiere más potencia de CPU al buscar referencias de objetos.
Conclusión
Aunque no es obligatorio tener una comprensión clara de cómo funciona JVM, con el propósito de escribir código Java, es inmensamente útil. Para un desarrollador que entiende el funcionamiento de JVM, escribirá un código mejor y optimizado, por largo o complejo que sea el requisito. Además de la descripción proporcionada aquí, JVM proporciona una amplia gama de características y tecnologías. Estas características se pueden usar para mejorar el rendimiento según lo necesite un proveedor específico
Artículos recomendados
Esta es una guía de Java Virtual Machine. Aquí discutimos la arquitectura de la máquina virtual Java junto con sus diversos componentes. También puede consultar los siguientes artículos para obtener más información:
- Ordenar burbujas en JavaScript
- Hilo Ciclo de vida en Java
- ¿Qué es Java SE?
- Los mejores compiladores de Java
- JRE vs JVM | Las 8 principales diferencias con (infografía)