La comprensión en profundidad de JVM: estructura de archivos de clases

En primer lugar,

En java nacido cuando hay un lema: "una vez, ejecuta en todas partes !." Bytecode esta pieza funciones.

Nota : JVM y no incluyen cualquier idioma, incluyendo la unión sólo con la Clase archivos asociados con este formato de archivo binario de java en particular.

Otros idiomas pueden generar código de bytes por un compilador, y luego ejecutar la JVM anteriormente.

javaèææº

Dos, archivos de clase

Cualquier archivo corresponde clase a la que sólo una clase o información de definición de interfaz, pero a su vez el derecho a decir no.

archivo de clase es un conjunto de flujo binario de 8 bits en unidades de bytes en base a respectivos elementos de datos están dispuestos de forma compacta en estricta conformidad con otro archivo de clase, sin ningún aumento carácter de salto intermedio.

Formato de archivo de clase utiliza una estructura similar a la estructura de almacenamiento de datos ficticios del lenguaje C, estas estructuras de datos pseudo son sólo dos tipos: sin firmar y mesas

Sin signo pertenecen a los tipos de datos básicos, a U1, U2, U4, U8 números sin signo representado 1-8 bytes.

Una pluralidad de mesas son número sin signo u otros tipos de datos complejos como una configuración de elemento de datos tabla.

archivo completo de clases es esencialmente una mesa, se acostumbra a "_info" al final.

ClassFile {
    u4             magic; //Class 文件的标志
    u2             minor_version;//Class 的小版本号
    u2             major_version;//Class 的大版本号
    u2             constant_pool_count;//常量池的数量
    cp_info        constant_pool[constant_pool_count-1];//常量池
    u2             access_flags;//Class 的访问标记
    u2             this_class;//当前类
    u2             super_class;//父类
    u2             interfaces_count;//接口
    u2             interfaces[interfaces_count];//一个类可以实现多个接口
    u2             fields_count;//Class 文件的字段属性
    field_info     fields[fields_count];//一个类会可以有个字段
    u2             methods_count;//Class 文件的方法数量
    method_info    methods[methods_count];//一个类可以有个多个方法
    u2             attributes_count;//此类的属性表中的属性数
    attribute_info attributes[attributes_count];//属性表集合
}

ç ± »AEA» ¶åèç ç »AEC» ç »ç¤ºæå¾

1, el número de magia

u4             magic; //Class 文件的标志

Antes de cada archivo de clase 4 bytes denominado número mágico, que es una señal de identificación de archivos de clase, los primeros cuatro bytes: 0xCAFBBABE.

2, versión de la clase

u2             minor_version;//Class 的次版本号
u2             major_version;//Class 的主版本号

Seguido por el número de versión es de 4 bytes, la versión de bytes como número menor de 5,6, 7,8 byte número de versión principal.

números de versión de Java a partir de 45 (versión primaria), después de JDK 1.1, 1 cada vez.

(Jdk1.0 - JDK1.1 utilizan 45,0-45,3), el JDK 1.1 puede soportar 45,0-45,65535

El jdk1.2 apoya 45,0-46,65535. jdk compatible con versiones anteriores.

3, piscina constante

u2             constant_pool_count;//常量池的数量
cp_info        constant_pool[constant_pool_count-1];//常量池

Inmediatamente después del número de versión principal y secundaria es la piscina constante, el número de la piscina es constante constant_pool_count-1 ( contador de memoria constante comienza a contar a partir de 1, 0 a vaciar la primera constante es de especial consideración, el valor del índice 0 representa " una piscina constante no hace referencia a cualquier elemento " ).

La piscina constante puede ser entendida como almacén de recurso de archivo de clase, que es el mayor tipo de estructura de archivos de datos asociada con otros proyectos.

La piscina principal constante almacenar dos constantes: las referencias literales y simbólicos . constante literal relativamente cerca del concepto de nivel de lenguaje Java, tales como cadenas de texto, declarado como un valor constante final y así sucesivamente. El concepto de los aspectos principales referencias simbólicas de la compilación pertenece. Que comprende las siguientes tres constantes: las clases y las interfaces totalmente nombre calificado, el nombre y los descriptores, el nombre del método y campos del descriptor.

Cada uno es una constante en la mesa de billar constante, las 14 mesas tienen una característica común: ¿Qué constantes a partir del primer tipo es un indicador -tag U1 para identificar el tipo de constantes que representan la parte actual de esta constante escriba.

tipo Marcos (tag) descripción
CONSTANT_utf8_info 1 UTF-8 cadena codificada
CONSTANT_Integer_info 3 literal de plástico
CONSTANT_Float_info 4 literales flotantes
CONSTANT_Long_info 5 literales enteros largos
CONSTANT_Double_info 6 flotante de precisión doble de puntos literales
CONSTANT_Class_info 7 Referencia clase símbolo o interfaz
CONSTANT_String_info 8 Los literales de tipo String
CONSTANT_Fieldref_info 9 Una referencia al campo símbolo
CONSTANT_Methodref_info 10 método de clase El símbolo de referencia
CONSTANT_InterfaceMethodref_info 11 El método del símbolo de referencia de interfaz
CONSTANT_NameAndType_info 12 campo del símbolo de referencia o método
CONSTANT_MothodType_info dieciséis El método de los tipos de signos
CONSTANT_MethodHandle_info 15 representación mango
CONSTANT_InvokeDynamic_info 18 Representa un punto método dinámico invocación

4, la bandera de acceso

Tras el final de la piscina constante, seguido de dos bytes representan la bandera de acceso Este indicador se utiliza para identificar algunas de las informaciones clase o acceso a nivel de interfaz, incluyendo:. La clase es una clase o una interfaz, ya sea de tipo público o abstracto, si se trata de la clase las palabras han sido declarados como final, y así sucesivamente.

± ç »¥ 访é®åå ° ± æ§ä¿®é ç¬ |

5, índice de clase, el índice y el índice de matriz Ajustar interface

u2             this_class;//当前类
u2             super_class;//父类
u2             interfaces_count;//接口
u2             interfaces[interfaces_count];//一个雷可以实现多个接口

índice de clase, el índice es un tipo de datos U2 clase padre, y la interfaz es una colección de tipo de índice u2,

Clase y el índice de clase padre cada índice apunta a un descriptor de tipo para las constantes CONSTANT_Class_info, se pueden encontrar por nombre de la clase valor de índice constante de la clase de cadena completa.

índice de clase se utiliza para determinar el nombre completo del índice de clase, clase padre se utiliza para determinar el nombre completo de la clase padre de esta clase, porque el lenguaje Java, herencia simple, por lo que el índice es solamente uno de los padres, además de  java.lang.Object fuera, toda la clase java tiene una clase padre, lo que además de  java.lang.Object fuera, el índice de matriz de todas las clases de Java son diferentes de cero.

conjunto de índices interfaz se utiliza para describir esta clase implementa las interfaces, se llevarán a cabo estas interfaces implents(si la clase es una interfaz en sí misma, es extends) la interfaz según el orden de izquierda a derecha en el conjunto de índice de interfaz.

6, un conjunto de campos de la tabla

u2             fields_count;//Class 文件的字段的个数
field_info     fields[fields_count];//一个类会可以有个字段

tabla de campos: variable que se utiliza para describir una interfaz o declarado en la clase, pero no incluye una variable local.

estructura de la tabla Campo
tipo nombre cantidad descripción
u2 access_flags 1 Esto describe el campo de indicador de acceso
u2 name_index 1 nombre sencillo, una constante referencia constantes de la piscina.
u2 description_index 1 Se utiliza para describir el tipo de campo de datos, la lista de parámetros método (incluyendo el número, tipo y orden), y el valor de retorno
u2 attributes_count 1 Contadores, son 0 (excepto constantes) para el campo promedio
attribute_info atributos attributes_count Se utiliza para almacenar información extra

access_flags valores:

åæ®μçaccess_flagsçåå¼

Nota : En el campo del lenguaje Java no está sobrecargado, dos campos de tipo de datos, los modificadores son los mismos debe utilizar un nombre diferente, pero para el código de bytes, si la palabra descriptor de segmento es inconsistente, ese campo pesada nombrarlo legal.

7. La tabla de conjunto método

El método de la estructura es casi similar a la estructura de la columna de la tabla de la tabla, hay diferencias sólo en las opciones y la bandera de acceso se establecen tabla de atributos.

Nota : En el lenguaje Java, para anular un método, además de tener el mismo nombre que el método original, también llamada debe tener un diferentes y originales firmas de método, esta característica de la firma es un método para cada parámetro en la piscina constante símbolo de referencia conjunto de campos, en la que el valor de retorno no es tan lenguaje java se basa únicamente en un valor de retorno diferente de las sobrecargas de métodos existentes.
 

u2             methods_count;//Class 文件的方法的数量
method_info    methods[methods_count];//一个类可以有个多个方法

æ¹æ³è¡¨ç access_flag åå¼
8, la tabla de atributos

u2             attributes_count;//此类的属性表中的属性数
attribute_info attributes[attributes_count];//属性表集合

Puede traer su propio conjunto de tabla de atributos del archivo de clase, tabla de campos, la tabla de métodos, para ciertos escenarios describen la información propietaria. archivos de clase y el orden de los otros elementos de datos requieren diferentes longitudes y establecer restricciones de contenido tabla de atributos es ligeramente más flojo, la tabla de atributos es más larga requiere cada uno con un orden estricto, y no se superpongan a nombre de atributo existente, y cualquier sin lograr compiladores pueden escribir su propia definición de la información de atributos a la tabla de atributos, ignora lo atribuyen no reconoce la máquina virtual Java se está ejecutando.

código de propiedad:

código de programa Java en el cuerpo del método después del proceso de compilación javac, con el tiempo se convierte en instrucciones de código de bytes almacenados en la propiedad de código.

código de estructura de la tabla de atributos
tipo nombre cantidad descripción
u2 attribute_name_index 1 Que apunta a un índice constante de cadena, código como "código"
U4 attribute_length 1 valor del atributo punto de la longitud
u2 max_stack 1 Representante de la profundidad máxima de la pila de operandos, valor de profundidad JVM pila se asigna de acuerdo con el marco de pila operando.
u2 max_locals 1 Almacenado en el espacio de tabla de variables locales. Donde la ranura es la unidad más pequeña de la asignación de memoria de variables locales utilizados por no más de 32 ... otro tipo de datos con una ranura, por el tipo de datos de 64 bits que se requiere para almacenar dos ranura.
U4 code_length 1 la longitud del código de bytes representativa. JVM en un método predeterminado no permite más de 65.535 instrucciones de código de bytes, aunque es un tipo de valor de la longitud U4, pero en realidad sólo una u2 longitud.
u1 código · code_length Para almacenar una serie de instrucciones de código de bytes en el flujo de bytes.
u2 exception_table_length 1  
exception_info exception_table exception_table_length  
u2 attributes_count 1  
attribute_info atributos attributes_count  

tabla de variables locales: Los parámetros del método (incluyendo parámetros ocultos en el presente ejemplo), muestran los parámetros de anomalías en el proceso (es decir, try-catch declaración excepción de intersección definida), las variables locales definidas en el cuerpo del método.

Publicados 134 artículos originales · ganado elogios 91 · vistas 160 000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_44588495/article/details/104121539
Recomendado
Clasificación