Java JVM: estructura de archivo de clase de clase (4)

Java mantiene una buena compatibilidad con versiones anteriores y la estabilidad de la estructura de archivos de Clase es indispensable

1. La piedra angular de la irrelevancia

  • La máquina virtual Java no está vinculada a ningún lenguaje de programación, incluido el lenguaje Java, solo está asociada con el formato de archivo binario específico de "Archivo de clase".
    • El archivo Class contiene el conjunto de instrucciones de la máquina virtual Java, la tabla de símbolos y otra información auxiliar.
  • A la máquina virtual no le importa en qué idioma está la fuente de la Clase

2. Archivos de clase

  • Java mantiene una buena compatibilidad con versiones anteriores y la estabilidad de la estructura de archivos de Clase es indispensable
  • Cualquier archivo de clase corresponde a la información de definición de una clase o interfaz única
    • Por el contrario, las clases o interfaces no necesariamente tienen que estar definidas en archivos (pueden generarse dinámicamente y enviarse directamente al cargador de clases)
  • Los archivos de clase son un conjunto de flujos binarios basados ​​en 8 bytes
    • Para elementos de datos que ocupan más de 8 bytes de espacio, se dividen en varios 8 bytes para almacenamiento de acuerdo con el primer método de orden superior
  • El análisis requiere dos tipos de datos como base
    • Los números sin signo son tipos de datos primitivos
      • Describa números, referencias de índice, valores de cantidad o cadenas de forma según la codificación UTF-8
    • Una tabla es un tipo de datos compuesto por varios números sin firmar u otras tablas como elementos de datos (que terminan en "_info").
  • Para describir múltiples datos del mismo tipo pero con un número variable, se utiliza un contador de capacidad previa
    • Una serie de datos continuos de cierto tipo es un "conjunto" de cierto tipo
  • La versión del número mágico y el archivo de clase.
    • Los primeros 4 bytes del archivo de clase se llaman el número mágico
      • Se utiliza para determinar si este archivo es un archivo de clase que puede aceptar la máquina virtual
    • Los bytes 5 y 6 son el número de versión secundaria, y los bytes 7 y 8 son el número de versión principal
      • El número de versión de Java comienza en 45. Las versiones superiores son compatibles con versiones anteriores, pero no con versiones posteriores.

3. Piscina constante

  • El almacén de recursos en el archivo de clase es el primer elemento de datos de tipo tabla que aparece en el archivo de clase.
  • Solo el conteo de capacidad del grupo constante en el archivo Clase comienza desde 1, y los demás comienzan desde 0
  • almacenamiento principal
    • Literal
      • cadena literal, valor constante declarado final
    • referencia de símbolo
      • Paquetes exportados o expuestos por módulos
      • nombres completos de clases e interfaces
      • Nombres de campo y descriptores
      • nombre del método y descriptor
      • Manejador de método y tipo de método
      • Sitios de llamadas dinámicas y constantes dinámicas
  • Cuando el código Java se compila con Javac, cuando la máquina virtual carga el archivo Class, se vincula dinámicamente
  • Cuando la máquina virtual realiza la carga de clases, obtendrá la referencia de símbolo correspondiente del grupo de constantes, la analizará y la traducirá a una dirección de memoria específica cuando se cree o ejecute la clase.
  • Cada constante en el grupo de constantes es una tabla
  • Una herramienta para analizar el código de bytes del archivo de clase: javap

4. Señal de acceso

  • Después del conjunto de constantes, los siguientes 2 bytes representan indicadores de acceso (access_flags)
    • Principalmente identifica la información de acceso a nivel de clase o interfaz, ya sea la clase interfaz, pública, abstracta, final, etc.
  • access_flags tiene un total de 16 banderas que se pueden usar
  • Índice de clase, índice de clase principal e índice de interfaz
    • Se utilizan tres elementos de datos para determinar la relación de herencia de este tipo
    • Índice de clase: determine el nombre completo de esta clase
    • Índice de clase principal: determine el nombre completo de la clase principal de esta clase
    • Índice de interfaz: describe qué interfaces implementa esta clase

Cinco, colección de mesa

  • colección de mesa de campo
    • Se utiliza para describir variables declaradas en interfaces o clases.
    • Puede incluir modificadores con alcance de campo (modificadores públicos, privados, protegidos), variables de instancia o variables de clase, mutabilidad, visibilidad concurrente, tipos de datos de campo, etc.
    • Nombre completo: Reemplace el "." en el nombre completo de la clase con "/"
    • Nombre simple: el método inc() y el campo m son: "inc" y "m" respectivamente
    • Cadena[][] => [[Ljava/idioma/Cadena
    • int[] => [yo
  • colección de tablas de métodos
    • Estructura: bandera de acceso banderas_de_acceso, índice de nombres índice_de_nombres, índice de descriptor índice_descriptor, tabla de atributos conjunto de atributos
  • colección de tablas de atributos
    • Los archivos de clases, las tablas de campos y las tablas de métodos pueden llevar sus propias colecciones de tablas de atributos.
    • Ya no es necesario que cada tabla de atributos tenga un orden estricto Siempre que no se superponga con los nombres de atributos existentes, cualquier compilador implementado por cualquier persona puede escribir su propia información de atributo definida en la tabla de atributos.

6. Introducción a las instrucciones de código de bytes

  • El conjunto de instrucciones de código de bytes se puede considerar como una arquitectura de conjunto de instrucciones con características distintivas, ventajas y desventajas sobresalientes.
  • La longitud del código de operación de la máquina virtual Java está limitada a un byte, y el número total de códigos de operación en el conjunto de instrucciones no puede exceder los 256.
  • Código de bytes y tipos de datos
    • La instrucción iload se usa para cargar los datos de tipo int desde la tabla de variables locales a la pila de operandos, y fload es del tipo flotante.
    • El conjunto de instrucciones de la máquina virtual Java solo proporciona instrucciones limitadas relacionadas con el tipo para admitir operaciones específicas.
  • instrucciones de carga y almacenamiento
    • Las instrucciones de carga y almacenamiento se utilizan para transferir datos hacia y desde la tabla de variables locales en el marco de la pila y la pila de operandos.
    • La pila de operandos y la tabla de variables locales para almacenar datos son operadas principalmente por instrucciones de carga y almacenamiento
  • Instrucción de operación
    • Adición de instrucciones: iadd, ladd, fadd, dadd
    • Instrucciones de resta, instrucciones de multiplicación...
  • otro
    • instrucción de conversión de tipo
    • instrucciones de gestión de la pila de operandos
    • instrucción de transferencia de control
    • Llamadas a métodos e instrucciones de retorno
    • instrucciones de manejo de excepciones
    • comando síncrono

7. Diseño compartido, implementación privada

  • Cómo se implementan las máquinas virtuales
    • Traducir el código de máquina virtual Java de entrada a otro conjunto de instrucciones de máquina virtual en tiempo de carga o tiempo de ejecución
    • Traducción del código de entrada de la máquina virtual Java al conjunto de instrucciones nativas del procesador host en el momento de la carga o en el momento de la ejecución (es decir, incluso técnicas de generación de código del compilador)

Supongo que te gusta

Origin blog.csdn.net/baidu_40468340/article/details/128785629
Recomendado
Clasificación