Saltar al contenido
Portada » Máquina Virtual de Java

Máquina Virtual de Java

La Máquina Virtual de Java (JVM-Java Virtual Machine) actúa como un motor en el cual ejecutar aplicaciones Java. La JVM es la responsable de llamar al método main presente en el código Java. La JVM es parte del JRE (Java Runtime Environment).

Las aplicaciones Java se denominan WORA (Write Once Run Anywhere). Esto significa que un desarrollador puede escribir código en un sistema operativo y podrá ser ejecutado en cualquier otro sistema donde pueda instalarse un JRE.

Cuando compilamos un fichero .java se genera un fichero .class que contiene el byte-code. Al ejecutar este fichero .class se siguen varios pasos que describen el funcionamiento de la JVM:

Subsistema del “Class Loader”

Este subsistema es responsable de tres funciones:

  • Carga (Loading)
  • Enlazado (Linking)
  • Inicialización (Initialization)

Carga (Loading)

El cargador de clases lee el fichero .class, genera el binario correspondiente y lo guarda en el method area.

Tras cargar el fichero .class, la JVM crea un objeto del tipo de la clase para representar este fichero en la memoria de heap.Para obtener la referencia de este objeto puede usarse el método getClass() de la clase Object.

Enlazado (Linking)

Ejecuta la verificación, preparación y (opcionalmente) la resolución.

  • Verificación: Asegura que el fichero .class sea correcto. En caso de que falle generará una excepción de tipo java.lang.VerifyError. esta actividad la ejecuta el componente ByteCodeVerifier. Una vez esta actividad se completa, el fichero .class está listo para compilar.
  • Preparación: La JVM reserva en memoria para las variables estáticas y valores por defecto de la clase.
  • Resolución: Es el proceso de reemplazar las referencias simbólicas de los tipo con referencias directas.

Inicialización (Initialization)

En esta fase todas las variables estáticas son asignadas con sus valores definidos en el código y los bloques estáticos. Esto se ejecuta de arriba abajo en la clase y de los padres a los hijos en la jerarquía de clases. Hay tres cargadores de clases:

  • Bootstrap class loader
  • Extension class loader
  • System/Application class loader

Memoria de la JVM

  • Method area: Se almacena toda la información a nivel de clase como su nombre, sus métodos, sus padres, etc. Solo hay un method area por JVM y es un recurso compartido. Desde Java 8 todas las variables estáticas se almacenan en la Heap area.
  • Heap area: Aquí se guarda información sobre todos los objetos. Es un recurso compartido.
  • Stack area (Pila): Para cada hilo, la JVM crea una pila en tiempo de ejecución. Cada bloque de la pila se llama marco de activación de registro que almacena llamadas a métodos. Todas las variables locales de cada método se almacenan en su marco correspondiente.
  • Registros: Almacena la dirección de la instrucción de un hilo ejecutándose en curso. Cada hilo tiene su propio conjunto de registros.
  • Native method stacks: Para cada hilo se genera una pila separada.

Motor de Ejecución

El motor de ejecución ejecuta el .class (bytecode). Lee el bytecode linea a linea, usa los datos y la información presente en memoria y ejecuta instrucciones. Se divide en tres partes:

  • Intérprete: Interpreta el bytecode linea a linea y lo ejecuta.
  • Just-in-time Compiler (JIT): Incrementa la eficiencia del intérprete.
  • Garbage Collector: Recolector de memoria. Destruye los objetos que quedan sin referencia para liberar espacio de memoria.

Java Native Interface (JNI)

Es una interfaz que interactúa con la librería de métodos nativos y provee las librerías nativas (C, C++) requeridas para su ejecución. Posibilita a la JVM poder llamar librerías de C y C++.


Más recursos Java

AsuntoDescripción
Tutorial básico y sintaxisTutorial básico Java y sintaxis. Aprende los fundamentos del lenguaje.
Hilos (Threads)Aprende a manejar hilos y las cuestiones básicas de la concurrencia
Funciones LambdaAquí te enseñamos las nociones más importantes para arrancas con funciones lambda
PalíndromosPrograma de ejemplo para el uso de palíndromos en Java.
Máquina Virtual de JavaTe explicamos el funcionamiento de la máquina virtual de java (Java Virtual Machine – JVM)
JDK, JRE y JVMDiferencias entre el JDK, JRE y JVM.
Mejores libros Java en EspañolHazte con los mejores libros Java para aprender paso a paso y profundizar en las mejores prácticas
TensorFlowManejo del API de TensorFlow para la construcción de grafos de operaciones y su ejecución
Tutorial Log4jTutorial para el manejo de Log4j, herramienta ágil y flexible para la gestión de Logs en Java
Java SecurityEntiende y aplica las posibilidades que da Java para mantener la seguridad
Tutorial JConsoleAprende los conceptos básicos de monitorización de procesos Java con JConsole
JavaFXTutorial de JavaFX, librería gráfica moderna para construcción de GUIs en móvil, escritorio y web.
Estructuras de datos en JavaExplicación y ejemplos de las estructuras de datos más importantes: listas, pila, cola, arbol.
JavaapiConjunto de clases, interfaces, métodos y paquetes que forman parte de la plataforma Java estándar
Algoritmo HuffmanMétodo eficiente para codificar datos, asignando códigos más cortos a los caracteres más frecuentes

Algoritmos matemáticos en Java

AlgoritmoDescripción
Sucesión de FibonacciAprende a programar en Java la famosa sucesión de Fibonacci
Números PrimosAlgoritmo de cálculo en Java para saber si un número es primo
FactorialCálculo del factorial de un número en Java
Número PiAprende a calcular Pi en Java
Número eNúmero e, algoritmo en Java
Raíz cuadradaDesarrollo en Java del algoritmo raíz cuadrada
Números PerfectosDetermina en Java si un número es “perfecto”
Conversión binario – hexadecimalConversor binario a hexadecimal en Java
Generación de números aleatoriosGenerar números aleatorios entre 1 y 100, ejemplos prácticos
Matrices en JavaCrea una matriz en Java y manéjala con soltura
Calculadora en JavaEjemplo sencillo para montar una calculadora en java con interfaz básica