Comprenda rápidamente el principio de JVM - [Conceptos básicos]

Comprenda rápidamente el principio de JVM - [Conceptos básicos]

¿Qué es una máquina virtual Java?

La esencia de la máquina virtual Java es una computadora " virtual ". Generalmente se entiende que un "software" está instalado en la computadora.

Las máquinas virtuales generalmente se dividen en dos categorías:

  • Máquina virtual del sistema [plataforma de software que puede ejecutar un sistema operativo completo]
  • Máquina virtual de programa [diseñada para la ejecución de un único programa informático]

¡ Cualquier tipo está limitado a los recursos proporcionados por la máquina virtual !inserte la descripción de la imagen aquí

Tipos comunes de lenguajes de programación

Existe una relación inseparable entre las máquinas virtuales y los lenguajes, por lo que la máquina virtual Java también se basa en un lenguaje compilado estáticamente similar a una máquina virtual**.

Los lenguajes de programación comunes se dividen en tres categorías :

  1. Explicación de lenguaje de máquina
    : Ejecute la instrucción binaria 0101 directamente al host sin traducción, y cada código de operación tiene un circuito correspondiente dentro de la computadora para completarlo.
  2. lenguaje ensamblador
    Cualquier lenguaje de bajo nivel utilizado en computadoras electrónicas, microprocesadores, microcontroladores u otros dispositivos programables. La mayoría de las computadoras se pueden manipular utilizando secuencias mnemotécnicas en lugar de códigos de manipulación numéricos.
  3. El lenguaje de alto nivel
    es conveniente para que todos lo entiendan y luego diseñen e implementen rápidamente el código del programa. Una vez que se completa el código, se convierte en un código de ejecución ensamblado o correspondiente a la máquina a través de la compilación o interpretación, y luego se ejecuta en la máquina.
    inserte la descripción de la imagen aquí

Realización multiplataforma de Java

Los formularios de archivo compilados por diferentes sistemas de lenguaje C son diferentes, y
inserte la descripción de la imagen aquí
el lenguaje Java se compila en datos de bytes a través del procesamiento unificado de la máquina virtual.
inserte la descripción de la imagen aquí


    Composición de la máquina virtual Java

    La composición de la máquina virtual Java se compone principalmente de 4 partes

    • ClassLoader (cargador de clases)
    • Área de datos de tiempo de ejecución (área de datos de tiempo de ejecución, partición de memoria)
    • Motor de ejecución
    • Interfaz nativa (interfaz de biblioteca nativa)

    proceso central

    inserte la descripción de la imagen aquí

    ClassLoader (cargador de clases)

    ClassLoader es responsable de cargar archivos de código de bytes, es decir, archivos de clase. Los archivos de clase tienen marcas de archivo específicas al comienzo del archivo, y ClassLoader solo es responsable de cargar archivos de clase.

    Ciclo de vida de clase y proceso de carga.

    Hay 7 etapas en el ciclo de vida de una clase en la JVM.
    Son Carga, Verificación, Preparación, Resolución, Inicialización, Uso y Descarga . Las primeras cinco partes (carga, verificación, preparación, análisis e inicialización) se conocen colectivamente como carga de clases
    inserte la descripción de la imagen aquí
    .

    Es encontrar el "archivo de clase" en el sistema de archivos/en el paquete jar/o donde sea que exista. Si no se puede encontrar la representación binaria, se arrojará un error NoClassDefFound.La
    fase de carga no verifica la sintaxis y el formato del archivo de clase.

    Comprobar (Cargando)

    La primera etapa del proceso de vinculación es la verificación para garantizar que la información del flujo de bytes en el archivo de clase cumpla con los requisitos de la máquina virtual actual y no ponga en peligro la seguridad de la máquina virtual.

    Preparación

    Al ingresar a la etapa de preparación, esta etapa creará campos estáticos, los inicializará a valores predeterminados estándar (como nulo o 0) y asignará tablas de métodos, es decir, asignará el espacio de memoria utilizado por estas variables en el área de métodos.
    Resolución
    simplemente significa que en el código que escribimos, cuando una variable se refiere a un objeto, la referencia se almacena como una referencia simbólica en el archivo .class (equivalente a hacer un registro de índice). Debe resolverse y vincularse como una referencia directa (equivalente a apuntar al objeto real) durante la fase de análisis. Si hay una referencia directa, el destino al que se hace referencia debe existir en el montón. Al cargar una clase, se deben cargar todas las superclases y las superinterfaces.
    Inicialización (Resolución)

    La especificación JVM establece claramente que la inicialización de la clase debe realizarse en el primer "uso activo" de una clase.
    El proceso de inicialización implica ejecutar:

    • método constructor de clase estático
    • instrucción de asignación de variable estática
    • Si una subclase inicializa el bloque de código estático estático , su clase principal se inicializará primero para garantizar que su clase principal se inicialice antes que la subclase.
      Entonces, de hecho, para inicializar una clase en java, la clase java.lang.Object debe inicializarse primero, porque todas las clases de java heredan de java.lang.Object.

    Motor de ejecución

    Motor de ejecución, también llamado Intérprete. Después de cargar el archivo de clase, la información de instrucciones y datos se colocará en la memoria, y el motor de ejecución es responsable de interpretar estos comandos para el sistema operativo, es decir, traducir el conjunto de instrucciones de JVM al conjunto de instrucciones del sistema operativo.

    Interfaz nativa

    Responsable de invocar la interfaz local. La función principal es llamar a las interfaces de diferentes idiomas para JAVA. Registrará el método local correspondiente en la pila de métodos nativos y luego cargará la biblioteca local correspondiente a través del motor de ejecución al llamar al método.

    Área de datos de tiempo de ejecución (área de datos de tiempo de ejecución, partición de memoria)

    inserte la descripción de la imagen aquí

    Tiempo de ejecución Descripción Extracto Referencias "Comprensión profunda de la máquina virtual JVM-Tercera edición" -Zhou Zhiming-¡Respeta la originalidad! !
    Contador de programa
    El contador de programa (registro de contador de programa) es un pequeño espacio de memoria, que se puede ver como el indicador de número de línea del código de bytes ejecutado por el subproceso actual. En el modelo conceptual de la máquina virtual Java [1], el intérprete de código de bytes selecciona la siguiente instrucción de código de bytes que se ejecutará cambiando el valor del contador cuando funciona.Es un indicador del flujo de control del programa, rama, bucle, salto , el manejo de excepciones, la recuperación de subprocesos y otras funciones básicas deben depender de este contador para completarse.

    Dado que los subprocesos múltiples de la máquina virtual Java se implementan cambiando los subprocesos por turnos y asignando el tiempo de ejecución del procesador,
    un procesador (un núcleo para un procesador multinúcleo) solo ejecutará instrucciones en un subproceso. Por lo tanto, para volver a la posición de ejecución correcta después del cambio de subproceso, cada subproceso debe tener un contador de programa independiente. Los contadores entre subprocesos no se afectan entre sí y se almacenan de forma independiente. Llamamos a este tipo de área de memoria "subproceso privado". .de la memoria.

    La pila de la máquina virtual de Java
    es la misma que el contador del programa, **la pila de la máquina virtual de Java (Java Virtual Machine Stack)** también es privada para subprocesos y su ciclo de vida es el mismo que el del subproceso. La pila de la máquina virtual describe el modelo de memoria de subprocesos de la ejecución del método Java: cuando se ejecuta cada método, la máquina virtual Java creará sincrónicamente un marco de pila [1] (marco de pila) para almacenar tablas de variables locales, pilas de operandos, información dinámica sobre conexiones , salidas de método, etc. El proceso de cada método que se llama hasta que se completa la ejecución corresponde al proceso de un marco de pila desde que se empuja hasta que se coloca en la pila de la máquina virtual.
    Porque los subprocesos múltiples de la máquina virtual Java se realizan cambiando los subprocesos y asignando el tiempo de ejecución del procesador.

    pila de métodos nativos

    Las pilas de métodos nativos (Native Method Stacks) son muy similares a las pilas de máquinas virtuales. La diferencia es que la pila de la máquina virtual sirve a la máquina virtual para ejecutar métodos Java (es decir, códigos de bytes), mientras que la pila de métodos nativos sirve a la máquina virtual. servicio de método local (nativo) utilizado por la máquina.

    Montón de Java
    Para las aplicaciones de Java, el montón de Java (Java Heap) es la pieza de memoria más grande administrada por la máquina virtual. El montón de Java es un área de memoria compartida por todos los subprocesos y creada cuando se inicia la máquina virtual. El único propósito de esta área de memoria es almacenar instancias de objetos, y "casi" todas las instancias de objetos en el mundo de Java asignan memoria aquí.

    inserte la descripción de la imagen aquí

    Área de método El
    área de método (Área de método), al igual que el montón de Java, es un área de memoria compartida por cada subproceso Se utiliza para almacenar datos como información de tipo, constantes, variables estáticas y cachés de código compilados por el compilador en tiempo real que han sido cargados por la máquina virtual .

    **Runtime Constant Pool** es parte del área de métodos. Además de la versión de clase, los campos, los métodos, las interfaces y otra información de descripción en el archivo de clase, también hay una tabla de agrupación de constantes (Tabla de agrupación de constantes), que se utiliza para almacenar varios literales y referencias de símbolos generadas durante la compilación. El contenido se almacenará en el grupo de constantes de tiempo de ejecución en el área de métodos después de cargar la clase.


      Referencia
      Zhou Zhiming: comprensión profunda de los datos de JVM

      Supongo que te gusta

      Origin blog.csdn.net/jjc120074203/article/details/128921376
      Recomendado
      Clasificación