Módulo de memoria de máquina virtual Java

Escribe al frente:

Este artículo es una comprensión profunda de las notas de lectura de la tercera edición de Java Virtual Machine (Zhou Zhiming), y las imágenes son de libros electrónicos

Entre Java y C ++ hay un muro alto rodeado de asignación dinámica de memoria y tecnología de recolección de basura. La gente que está fuera del muro quiere entrar, pero la gente que está dentro del muro se le ocurre.

1 Descripción general

Según la "Especificación de máquina virtual Java", la memoria administrada por la máquina virtual Java incluye las siguientes áreas:

Comprensión de la máquina virtual Java Tercera edición Figura 2-1

1.1 Contador de programa (Registro de contador de programa)

El contador del programa es un pequeño espacio de memoria, que puede considerarse como el indicador del número de línea del código de bytes ejecutado por el hilo actual.

1.2 Pila de máquina virtual Java (Pila de máquina virtual Java)

Cuando se ejecuta cada método, la máquina virtual Java creará simultáneamente un marco de pila (Marco de pila) para almacenar variables locales, pila de operandos, conexión dinámica, salida de método y otra información.

1.3 Pilas de métodos nativos

La pila de métodos locales es similar a la función de la pila de máquinas virtuales. La diferencia es que la pila de máquinas virtuales ejecuta métodos Java, y la pila de métodos locales sirve a la máquina virtual utilizando métodos nativos.

1.4 Java 堆 (Java Heap)

El almacenamiento dinámico de Java es la pieza de memoria más grande administrada por la máquina virtual. En el mundo de Java, casi todas las instancias de objetos se asignan en el montón. La descripción del montón de Java en la "Especificación de máquina virtual de Java" es: "Todas las instancias de objetos y matrices deben asignarse en el montón (El montón son los datos de tiempo de ejecución área desde la cual se asigna la memoria para todas las instancias de clase y matrices ", pero con el avance de la tecnología de compilación en tiempo real, especialmente la tecnología de análisis de escape se está volviendo cada vez más poderosa, la asignación en pila, la optimización de reemplazo escalar significa que las instancias de objetos están todas asignadas en el montón no es tan absoluto Demasiado

El almacenamiento dinámico de Java es un área de memoria administrada por el recolector de elementos no utilizados, por lo que a veces se lo denomina "almacenamiento dinámico de GC" y los parámetros -Xmx y -Xms pueden establecer el tamaño del almacenamiento dinámico. '

1.5 Área del método

Se utiliza para almacenar datos como información de tipo, constantes, variables estáticas y caché de código compilado por el compilador en tiempo real que ha sido mezclado por la máquina virtual.

1.6 Grupo constante de tiempo de ejecución

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

1.7 Memoria directa

La memoria de la máquina física no pertenece al área de memoria definida en la "Especificación de la máquina virtual Java".

2 exploración de objetos de máquina virtual HotSpot

2.1 Conceptos relacionados

Colisión de puntero (Bump The Pointer) : suponiendo que la memoria en el montón de Java es absolutamente regular, toda la memoria usada se coloca en un lado, la memoria libre se coloca en el otro lado y se coloca un puntero en el medio como indicador del punto de demarcación , La memoria asignada es solo para mover el puntero al espacio libre por una distancia igual al tamaño del objeto. Este método de asignación se llama "colisión del puntero";

Lista libre : si la memoria en el almacenamiento dinámico de Java no es regular, la memoria utilizada y la memoria libre se entrelazan entre sí, entonces no hay forma de simplemente realizar una colisión de puntero, y la máquina virtual debe mantener una lista , Registre qué bloques de memoria están disponibles, encuentre un espacio lo suficientemente grande en la lista para asignarlo a la instancia del objeto durante la asignación y actualice los registros en la lista. Este método de asignación se denomina "lista libre" (Lista libre);

La elección del método de asignación está determinada por si el montón de Java es regular, y si el montón de Java es regular está determinado por si el recolector de basura utilizado tiene la capacidad de compactación de espacio (Compacto).

En la máquina virtual HotSpot, el diseño de los objetos en la memoria del montón se puede dividir en tres partes: encabezado de objeto (Encabezado), datos de instancia (Datos de instancia) y relleno de alineación (Relleno).

Encabezado del objeto (encabezado) : el encabezado del objeto contiene dos tipos de información, el primer tipo es almacenar los datos de tiempo de ejecución del objeto en sí, como el código hash, la edad de generación del GC, el indicador de estado de bloqueo, el bloqueo retenido por el hilo, el ID de hilo sesgado, el tiempo sesgado Poke, etc., también conocido como "Mark Word", el segundo tipo es un puntero de tipo, solo un puntero a sus metadatos de tipo, a través de esta máquina virtual de puntero para confirmar que este objeto es una instancia de esa clase.

Datos de instancia : información válida que el objeto realmente almacena.

Alinear relleno (Relleno) : opcional , función de marcador de posición.

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/w-m-m/p/12733116.html
Recomendado
Clasificación