Serie de preguntas de entrevista n. ° 5: grupo de constantes en tiempo de ejecución, grupo de constantes de cadena y grupo de constantes estáticas de JDK, ¿todavía está confundido?

"Serie de preguntas de la entrevista de Java": un conocimiento extenso y una columna muy interesante. Indagar en profundidad, analizar el código fuente, resumir los principios, combinar imágenes y textos, crear una serie de artículos en la cuenta oficial y elevar el nivel de entrevistas o no. Bienvenido a seguir prestando atención a [Program New Vision]. Este es el quinto.

[Extras] El núcleo de este artículo: las funciones y ubicaciones de almacenamiento del grupo de constantes de tiempo de ejecución, grupo de constantes de cadena y grupo de constantes estáticas del JDK en cada versión del JDK.

Al escribir esta serie de artículos, descubrí que una vez que se investiga la implementación subyacente, se verán involucrados algunos problemas de estructura de la memoria. Uno de los más involucrados es el grupo de constantes.Este artículo resume las funciones y la estructura de almacenamiento del grupo de constantes de tiempo de ejecución del JDK, el grupo de constantes de cadena y el grupo de constantes estáticas.

Estructura de la memoria en tiempo de ejecución de JVM

Antes de comprender el grupo de constantes, tomemos una fotografía para comprender todo el diagrama de distribución de memoria de la JVM. La siguiente figura muestra la estructura de la memoria de JDK7:
Inserte la descripción de la imagen aquí

En la figura anterior, la memoria administrada por JVM incluye principalmente las siguientes áreas: Registro de contador de programa, Pila de VM, Pila de método nativo, Área de método, Pila .

La estructura de la memoria de las distintas versiones de JVM tiene diferentes cambios, estos cambios tendrán un impacto en los tres conceptos de los que vamos a hablar hoy, los explicaremos uno a uno más adelante.

Conociendo la estructura de la memoria de la JVM, ¿en qué área de la JVM se encuentran el grupo de constantes de tiempo de ejecución, el grupo de constantes de cadena y el grupo de constantes estáticas? Primero echemos un vistazo a sus definiciones y funciones.

Pool de constantes estáticas

Cuando se va a ejecutar un programa Java, se requiere que un compilador compile primero el archivo de código fuente en un archivo de código de bytes (.class), que luego es interpretado y ejecutado por la JVM.

Además de la información de descripción de la versión de la clase, campos, métodos, interfaces, etc. en el archivo de la clase, también hay un grupo constante (tabla de grupo constante), que se utiliza para almacenar varias referencias literales y simbólicas generadas durante la compilación. Esta parte del contenido Se almacenará en el grupo de constantes de tiempo de ejecución después de que se cargue la clase.

El grupo de constantes estáticas es el grupo de constantes en el archivo de clase mencionado anteriormente. El grupo de constantes de clase existe en cada archivo de clase en tiempo de compilación. Se coloca información de símbolo diferente en la tabla constante de banderas diferentes.
Inserte la descripción de la imagen aquí

La información de símbolos almacenada en el grupo constante debe usarse cuando la JVM ejecuta instrucciones. Todos los elementos del grupo constante tienen el siguiente formato general:

cp_info {
    u1 tag;     //表示cp_info的单字节标记位
    u1 info[];  //两个或更多的字节表示这个常量的信息,信息格式由tag的值确定
}

La información del tipo admitido es la siguiente:
Inserte la descripción de la imagen aquí

Tomando CONSTANT_Class como ejemplo, se usa para representar una clase o interfaz, y el formato es el siguiente:

CONSTANT_Class_info {
 u1 tag;       //这个值为CONSTANT_Class (7)
 u2 name_index;//一个index,表示一个索引,引用的是CONSTANT_UTF8_info
}

El tipo CONSTANT_Class_info se compone de una etiqueta y un name_index. El índice en name_index indica que es un índice, que se refiere a CONSTANT_UTF8_info.

CONSTANT_Utf8_info se utiliza para representar el valor de una constante de carácter, la estructura es la siguiente:

CONSTANT_Utf8_info {
 u1 tag;
 u2 length;
 u1 bytes[length];
}

La etiqueta se expresa como: CONSTANT_Utf8 (1); la longitud indica la longitud de la matriz de bytes []; la matriz de bytes [] se refiere a la longitud anterior como su longitud. Las constantes de caracteres están representadas por una codificación UTF-8 mejorada.

Para el grupo de constantes estáticas, necesitamos saber que existe en el compilador. Si está relacionado con el tiempo de ejecución, se puede decir que las constantes en el tiempo de ejecución se asignan después de que la JVM carga el archivo de clase.

Grupo constante de tiempo de ejecución

El grupo de constantes de tiempo de ejecución es colocar la información de clase compilada en el área de método, lo que significa que es parte del área de método.

El grupo de constantes de tiempo de ejecución se utiliza para obtener de forma dinámica información de clase, que incluye: descripción de metainformación del archivo de clase, datos de código compilado, datos de tipo de referencia, grupo de constantes de archivo de clase, etc.

El grupo de constantes de tiempo de ejecución es para volcar el valor de referencia del símbolo en cada grupo de constantes de clase al grupo de constantes de tiempo de ejecución después de que se cargue la clase. Cada clase tiene un grupo de constantes de tiempo de ejecución. Una vez resuelta la clase, la referencia simbólica se reemplaza por una referencia directa, que es coherente con el valor de referencia en el grupo de constantes globales.

Otra característica del grupo de constantes en tiempo de ejecución en relación con el grupo de constantes del archivo de clase es que es dinámico. El lenguaje java no requiere que las constantes sean generadas solo por el compilador, es decir, el contenido del grupo de constantes no está preestablecido en el archivo de clase para ingresar al área de métodos para ejecutar Pool de constantes de tiempo, también se pueden poner nuevas constantes en el pool durante el funcionamiento.

Grupo constante de cadenas

El contenido del grupo de cadenas se almacena en el grupo de constantes de cadenas después de que la clase se cargue, verifique y prepare. Con respecto a la implementación específica del grupo de constantes de cadena, no la expandiremos aquí, y la explicaremos en un artículo especial más adelante.

El mecanismo de procesamiento del conjunto de constantes de cadena se ha mencionado en el artículo anterior. Solo una copia será almacenada y compartida por todas las clases. El proceso básico es: verificar si la cadena existe en el grupo constante antes de crear la cadena, si existe, obtener su referencia, si no existe, crearla y guardarla, y devolver la nueva referencia del objeto.

La ubicación del pool de constantes de cadenas cambia constantemente con la evolución de la versión JDK, a continuación lo explicaremos específicamente con una imagen.

Evolución constante de la ubicación de la memoria del grupo

Antes de JDK1.7, la lógica del grupo de constantes en tiempo de ejecución incluía un grupo de constantes de cadena almacenado en el área de métodos. En este momento, la máquina virtual del hotspot implementa el área de métodos como una generación permanente.
Inserte la descripción de la imagen aquí

En JDK1.7, el grupo de constantes de cadena y las variables estáticas se toman del área de método al montón, y el resto del grupo de constantes de tiempo de ejecución todavía está en el área de método, que es la generación permanente en el punto de acceso.
Inserte la descripción de la imagen aquí

En el hotspot JDK8, el metaespacio sustituto permanente (Metaspace) se eliminó y reemplazó. En este momento, el grupo de constantes de cadena todavía está en el montón, y el grupo de constantes de tiempo de ejecución todavía está en el área de método, pero la implementación del área de método ha cambiado de generación permanente a metaespacio (Metaspace). )
Inserte la descripción de la imagen aquí

A través del diagrama anterior, podemos saber fácilmente que el área de método y los componentes internos cambian constantemente en diferentes versiones.

resumen

A través de este artículo, explicamos el grupo de constantes en tiempo de ejecución, el grupo de constantes de cadena y el grupo de constantes estáticas de JDK uno por uno, e ilustramos las ubicaciones de memoria de diferentes versiones de JVM (máquina virtual de punto de acceso).

Para resumir, las variables estáticas están en el compilador y existen en el archivo de clase. Puede usar el comando javap verbose para ver el contenido del grupo de constantes estáticas cuando se fusiona la cadena; el grupo de constantes de cadena solía ser parte del grupo de constantes de tiempo de ejecución, ubicado Área de métodos, pero con la evolución de la versión JVM, los dos se han separado. Después de JDK8, el grupo de constantes de cadena se encuentra en el montón y el grupo de constantes de tiempo de ejecución se encuentra en el área de métodos.

De hecho, hay muchos más sobre esta parte, especialmente el grupo constante de cuerdas, invitamos a todos a seguir prestando atención. El conjunto de constantes de cadena se analizará en el futuro. En el proceso, también se encontró que muchos artículos describían sin especificar la versión JDK, que eran todos imparciales. Esta serie es para que todos investiguen, eliminen lo falso y mantengan la verdad.

Enlace original: " Serie de preguntas de entrevista n. ° 5: grupo de constantes de tiempo de ejecución de JDK, grupo de constantes de cadena, grupo de constantes estáticas, ¿sigue siendo estúpido y confuso?

Artículo de referencia:

https://blog.csdn.net/qq_31615049/article/details/81611918

https://blog.csdn.net/weixin_43232955/article/details/107411378


Nueva visión del procedimiento

La cuenta pública " Nueva Visión del Programa ", una plataforma que le permite mejorar simultáneamente su poder blando y su tecnología dura, proporcionando cantidades masivas de datos.

Cuenta oficial de WeChat: nueva visión del programa

Supongo que te gusta

Origin blog.csdn.net/wo541075754/article/details/108310119
Recomendado
Clasificación