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.
- Cargador de clases Bootstrap – carga la clase de la ruta de clases bootstrap (rt.jar -alta prioridad)
- Cargador de clases de extensión – carga la clase que se incluye en (jre/lib).
- Cargador de clases de aplicación – carga la clase de nivel de aplicación.
- 1.2 Vinculación : Realiza la verificación, preparación y resolución de la clase cargada.
- 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)
- Preparar : Para todas las variables estáticas en el bytecode , se asignará la memoria y se cargarán los valores por defecto.
- Resolver(Opcional): Las referencias simbólicas de la clase serán reemplazadas por las referencias originales del área de métodos.
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
- Á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.
- Á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.
- Variable local se almacenará en la memoria de la pila
- Seguro de hilos
- 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á.
- 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).
- 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)