Articles

¿La arquitectura de JVM y cómo funciona?

Prabhu Rajendran
28 de marzo, 2019 – 3 min read

Todos los desarrolladores de Java saben que el código de bits es ejecutado por JRE , pero JRE es la implementación de JVM. «que analiza el bytecode, interpreta el código y lo ejecuta».

La máquina virtual es una implementación de software de la máquina física.Java fue desarrollado con el concepto de WORA (Write Once Run Anywhere).El compilador compila el archivo java en un archivo de clase, entonces el archivo .class se introduce en la JVM que lo carga y lo ejecuta.

¿Cómo funciona la JVM?

  1. Subsistema de carga de clases
  2. Área de datos en tiempo de ejecución
  3. Motor de ejecución.

Ahora, Vamos a saltar a cada parte.

1.Class Loader SubSystem :

La funcionalidad de carga de clases dinámicas de Java es manejada por el subsistema del cargador de clases. «Cargar -> Enlazar -> Inicializar el archivo de clases» por primera vez en tiempo de ejecución.

1.1. Carga : Las clases serán cargadas por este componente.

  1. Cargador de clases Bootstrap – carga la clase de la ruta de clases bootstrap (rt.jar -alta prioridad)
  2. Cargador de clases de extensión – carga la clase que se incluye en (jre/lib).
  3. Cargador de clases de aplicación – carga la clase de nivel de aplicación.
  4. 1.2 Vinculación : Realiza la verificación, preparación y resolución de la clase cargada.
  5. Verificar : El verificador de bytecode verificará si el bytecode generado es correcto o no, de lo contrario obtendremos un error de verificación (java.lang.VerifyError)
  6. Preparar : Para todas las variables estáticas en el bytecode , se asignará la memoria y se cargarán los valores por defecto.
  7. Resolver(Opcional): Las referencias simbólicas de la clase serán reemplazadas por las referencias originales del área de métodos.
  8. 1.3 Inicialización : Fase final del cargador de la clase , aquí todas las variables estáticas se asignarán valores originales & bloque estático se ejecuta.

    2. Área de datos en tiempo de ejecución : (memoria de la JVM) – dividida en 5 componentes

    1. Área de métodos : aquí se almacenan todos los datos de nivel de clase (campos, método, variable estática). Sólo un área de métodos por JVM.
    2. Área Heap : se almacenarán todos los objetos & correspondientes a la instancia , variable , array. Un Heap por JVM
  • Donde Heap & Área de Método no son hilo seguro es recurso compartido para JVM

3. Área de Pila : Para cada hilo nueva pila en tiempo de ejecución se creará. Para cada llamada de método, una entrada se añadirá en la pila llamada marco de la pila.

  1. Variable local se almacenará en la memoria de la pila
  2. Seguro de hilos
  3. El marco de la pila se divide en tres sub entidades:

3.1 Array de Variables Locales: relacionadas con el método local , las variables son invloved

3.2 Pila de Operandos : Operación intermedia – actúa como espacio de trabajo en tiempo de ejecución para realizar la operación

3.3 Datos del Marco : se almacenarán todos los símbolos correspondientes al método , en caso de cualquier excepción , se mantendrá la información del bloque de captura.

4. Registros PC: Cada hilo tendrá un registro que almacena la operación que se está ejecutando actualmente (una vez que se actualiza cada instrucción, el registro PC también actualizará la siguiente instrucción)

5. Pila de métodos nativos: Mantiene la información de los métodos nativos para cada hilo.

3. Motor de ejecución: El código de bytes que se asigna en el área de datos de tiempo de ejecución se ejecutará.

  1. Interpretador: Interpreta el bytecode más rápido pero la ejecución es lenta.(un método es llamado múltiples veces creará una nueva Interpretación es requerida).
  2. Compilador JIT : neutraliza la desventaja del intérprete.Siempre que encuentra código repetido utiliza el Compilador JIT.

Compilará el bytecode en código nativo (El código nativo se utilizará directamente para las llamadas a métodos repetidos).

Generador de código intermedio : Genera código intermedio siempre que sea necesario

Optimizador de código: Optimiza el código

Generador de código objetivo : Convierte a código máquina/nativo

Profilador: Ayuda a encontrar las múltiples llamadas a métodos (encontrar hotspots)

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *